From 7513dc5ab9b312839187e7aab1130baeea62b548 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Aug 08 2017 19:49:34 +0000 Subject: Merge branch 'master' into shaders --- diff --git a/README.md b/README.md index 3ea6787..a71915e 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,13 @@ Older versions and unstable nightly build are also available at +License: CC0-1.0 + +Files: tanda/* +Copyright: Author: Marcelo "Tanda" Cerviño +License: CC0-1.0 + +Files: deevad/* +Copyright: Author: David Revoy +License: CC0-1.0 + +Files: kaerhon_v1/* +Copyright: Author: Guillaume Loussarévian +License: CC0-1.0 + +See also CC0-1.0 license at creativecommons.org +https://creativecommons.org/publicdomain/zero/1.0/ \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/blend+paint.myb b/stuff/library/mypaint brushes/classic/blend+paint.myb new file mode 100644 index 0000000..b6ce32f --- /dev/null +++ b/stuff/library/mypaint brushes/classic/blend+paint.myb @@ -0,0 +1,199 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 54.45, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.69, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.85, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.222222, + 0.0 + ], + [ + 0.324074, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.6, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.12, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/blend+paint_prev.png b/stuff/library/mypaint brushes/classic/blend+paint_prev.png new file mode 100644 index 0000000..309433a Binary files /dev/null and b/stuff/library/mypaint brushes/classic/blend+paint_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/blending_knife.myb b/stuff/library/mypaint brushes/classic/blending_knife.myb new file mode 100644 index 0000000..141b6a1 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/blending_knife.myb @@ -0,0 +1,263 @@ +{ + "comment": "MyPaint brush file", + "group": "oil", + "parent_brush_name": "classic/blending_knife", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.51, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.44, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "tilt_ascension": [ + [ + -180.0, + -180.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 5.02, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.9, + "inputs": { + "speed1": [ + [ + 0.0, + 0.028571 + ], + [ + 4.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 1.04, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.046296, + 0.71875 + ], + [ + 0.154321, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.1, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.15, + "inputs": { + "pressure": [ + [ + 0.0, + 0.958333 + ], + [ + 1.0, + 2.0 + ] + ], + "speed1": [ + [ + 0.0, + -0.916667 + ], + [ + 3.7, + -2.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.21, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 1.0, + 0.49 + ] + ], + "tilt_declination": [ + [ + 0.0, + 0.0 + ], + [ + 90.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 5.5, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/blending_knife_prev.png b/stuff/library/mypaint brushes/classic/blending_knife_prev.png new file mode 100644 index 0000000..bbaf671 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/blending_knife_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/blur.myb b/stuff/library/mypaint brushes/classic/blur.myb new file mode 100644 index 0000000..518ed4d --- /dev/null +++ b/stuff/library/mypaint brushes/classic/blur.myb @@ -0,0 +1,223 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/blur", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.6, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.4 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.7, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.4 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.2 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.4, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": -6.69, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/blur_prev.png b/stuff/library/mypaint brushes/classic/blur_prev.png new file mode 100644 index 0000000..9fd4f31 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/blur_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/brush.myb b/stuff/library/mypaint brushes/classic/brush.myb new file mode 100644 index 0000000..f18af68 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/brush.myb @@ -0,0 +1,245 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/brush", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.82, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.51, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 70.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.89, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.44, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.01, + "inputs": { + "pressure": [ + [ + 0.0, + -1.86375 + ], + [ + 0.237952, + -1.42 + ], + [ + 0.5, + -0.355 + ], + [ + 0.76506, + 1.42 + ], + [ + 1.0, + 2.13 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 4.47, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 2.48, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/brush_prev.png b/stuff/library/mypaint brushes/classic/brush_prev.png new file mode 100644 index 0000000..e81c052 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/brush_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/bulk.myb b/stuff/library/mypaint brushes/classic/bulk.myb new file mode 100644 index 0000000..7db1a63 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/bulk.myb @@ -0,0 +1,210 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/bulk", + "settings": { + "anti_aliasing": { + "base_value": 1.37, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.19, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.38, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.052469, + 0.625 + ], + [ + 0.166667, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.59, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/bulk_prev.png b/stuff/library/mypaint brushes/classic/bulk_prev.png new file mode 100644 index 0000000..391cef6 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/bulk_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/calligraphy.myb b/stuff/library/mypaint brushes/classic/calligraphy.myb new file mode 100644 index 0000000..3cd1441 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/calligraphy.myb @@ -0,0 +1,241 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/calligraphy", + "settings": { + "anti_aliasing": { + "base_value": 3.53, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 45.92, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 5.46, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.74, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.015, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.02, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.21 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/calligraphy_prev.png b/stuff/library/mypaint brushes/classic/calligraphy_prev.png new file mode 100644 index 0000000..49c4e3e Binary files /dev/null and b/stuff/library/mypaint brushes/classic/calligraphy_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/charcoal.myb b/stuff/library/mypaint brushes/classic/charcoal.myb new file mode 100644 index 0000000..f4d9df8 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/charcoal.myb @@ -0,0 +1,213 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.6354166666666666, + "inputs": {} + }, + "color_s": { + "base_value": 0.8807339449541285, + "inputs": {} + }, + "color_v": { + "base_value": 0.42745098039215684, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.6, + "inputs": { + "pressure": [ + [ + 0, + 0 + ], + [ + 1.0, + -1.4 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.4, + "inputs": { + "pressure": [ + [ + 0, + 0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0, + 0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.7, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/charcoal_prev.png b/stuff/library/mypaint brushes/classic/charcoal_prev.png new file mode 100644 index 0000000..24a020f Binary files /dev/null and b/stuff/library/mypaint brushes/classic/charcoal_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/coarse_bulk_1.myb b/stuff/library/mypaint brushes/classic/coarse_bulk_1.myb new file mode 100644 index 0000000..ebf414e --- /dev/null +++ b/stuff/library/mypaint brushes/classic/coarse_bulk_1.myb @@ -0,0 +1,191 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/coarse_bulk_1", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 50.42, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.52, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 10.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.66, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.59, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 1.5, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.95, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/coarse_bulk_1_prev.png b/stuff/library/mypaint brushes/classic/coarse_bulk_1_prev.png new file mode 100644 index 0000000..85b0e09 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/coarse_bulk_1_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/coarse_bulk_2.myb b/stuff/library/mypaint brushes/classic/coarse_bulk_2.myb new file mode 100644 index 0000000..7c00b33 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/coarse_bulk_2.myb @@ -0,0 +1,202 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/coarse_bulk_2", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 2.6, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.59, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 10.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.66, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.99, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.55, + "inputs": { + "random": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.95 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/coarse_bulk_2_prev.png b/stuff/library/mypaint brushes/classic/coarse_bulk_2_prev.png new file mode 100644 index 0000000..e410a1a Binary files /dev/null and b/stuff/library/mypaint brushes/classic/coarse_bulk_2_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/coarse_bulk_3.myb b/stuff/library/mypaint brushes/classic/coarse_bulk_3.myb new file mode 100644 index 0000000..9e8f6c1 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/coarse_bulk_3.myb @@ -0,0 +1,191 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/coarse_bulk_3", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.32, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 15.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.45, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.09, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.63, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.5, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/coarse_bulk_3_prev.png b/stuff/library/mypaint brushes/classic/coarse_bulk_3_prev.png new file mode 100644 index 0000000..da2acf0 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/coarse_bulk_3_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/dry_brush.myb b/stuff/library/mypaint brushes/classic/dry_brush.myb new file mode 100644 index 0000000..c3dd829 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/dry_brush.myb @@ -0,0 +1,224 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.4 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.1, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.6, + "inputs": { + "speed2": [ + [ + 0.0, + 0.042857 + ], + [ + 4.0, + -0.3 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/dry_brush_prev.png b/stuff/library/mypaint brushes/classic/dry_brush_prev.png new file mode 100644 index 0000000..c554a3a Binary files /dev/null and b/stuff/library/mypaint brushes/classic/dry_brush_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/imp_blending.myb b/stuff/library/mypaint brushes/classic/imp_blending.myb new file mode 100644 index 0000000..16aa0bb --- /dev/null +++ b/stuff/library/mypaint brushes/classic/imp_blending.myb @@ -0,0 +1,359 @@ +{ + "comment": "MyPaint brush file", + "group": "smudge", + "parent_brush_name": "classic/imp_blending", + "settings": { + "anti_aliasing": { + "base_value": 0.64, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "custom": [ + [ + -2.0, + -0.04 + ], + [ + 2.0, + 0.04 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.87963, + 0.02 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -10.0 + ], + [ + 1.0, + 10.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 4.41 + ], + [ + 90.0, + 0.0 + ] + ] + } + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 7.1, + "inputs": { + "speed1": [ + [ + 0.0, + -0.668571 + ], + [ + 4.0, + 4.68 + ] + ], + "stroke": [ + [ + 0.0, + -0.4 + ], + [ + 1.0, + 0.4 + ] + ], + "tilt_declination": [ + [ + 0.0, + 3.636875 + ], + [ + 90.0, + -7.59 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.6, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 0.0 + ], + [ + 45.0, + 0.0 + ], + [ + 90.0, + 0.63 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + -2.0 + ], + [ + 0.401235, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ], + "tilt_declination": [ + [ + 0.0, + 0.0 + ], + [ + 45.0, + 0.0 + ], + [ + 90.0, + -1.6 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/imp_blending_prev.png b/stuff/library/mypaint brushes/classic/imp_blending_prev.png new file mode 100644 index 0000000..6f39b81 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/imp_blending_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/imp_details.myb b/stuff/library/mypaint brushes/classic/imp_details.myb new file mode 100644 index 0000000..aaf3a1f --- /dev/null +++ b/stuff/library/mypaint brushes/classic/imp_details.myb @@ -0,0 +1,398 @@ +{ + "comment": "MyPaint brush file", + "group": "impressionism", + "parent_brush_name": "classic/imp_details", + "settings": { + "anti_aliasing": { + "base_value": 0.48, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "custom": [ + [ + -2.0, + -0.02 + ], + [ + 2.0, + 0.02 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.87963, + 0.02 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -10.0 + ], + [ + 1.0, + 10.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 4.41 + ], + [ + 90.0, + 0.0 + ] + ] + } + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 7.1, + "inputs": { + "speed1": [ + [ + 0.0, + -0.668571 + ], + [ + 4.0, + 4.68 + ] + ], + "stroke": [ + [ + 0.0, + -0.4 + ], + [ + 1.0, + 0.4 + ] + ], + "tilt_declination": [ + [ + 0.0, + 3.636875 + ], + [ + 90.0, + -7.59 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.09, + "inputs": { + "pressure": [ + [ + 0.0, + -0.653333 + ], + [ + 0.379268, + -0.459375 + ], + [ + 0.747561, + 0.18375 + ], + [ + 1.0, + 0.98 + ] + ], + "tilt_declination": [ + [ + 0.0, + 0.0 + ], + [ + 45.0, + 0.0 + ], + [ + 90.0, + 0.63 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + -2.0 + ], + [ + 0.401235, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ], + "tilt_declination": [ + [ + 0.0, + 0.0 + ], + [ + 45.0, + 0.0 + ], + [ + 90.0, + -1.6 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + 0.510417 + ], + [ + 1.0, + -1.0 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/imp_details_prev.png b/stuff/library/mypaint brushes/classic/imp_details_prev.png new file mode 100644 index 0000000..89453b3 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/imp_details_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/impressionism.myb b/stuff/library/mypaint brushes/classic/impressionism.myb new file mode 100644 index 0000000..68f16e3 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/impressionism.myb @@ -0,0 +1,380 @@ +{ + "comment": "MyPaint brush file", + "group": "impressionism", + "parent_brush_name": "classic/impressionism", + "settings": { + "anti_aliasing": { + "base_value": 0.66, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "custom": [ + [ + -2.0, + -0.04 + ], + [ + 2.0, + 0.04 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.87963, + 0.02 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -10.0 + ], + [ + 1.0, + 10.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 4.41 + ], + [ + 90.0, + 0.0 + ] + ] + } + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 7.1, + "inputs": { + "speed1": [ + [ + 0.0, + -0.668571 + ], + [ + 4.0, + 4.68 + ] + ], + "stroke": [ + [ + 0.0, + -0.4 + ], + [ + 1.0, + 0.4 + ] + ], + "tilt_declination": [ + [ + 0.0, + 3.636875 + ], + [ + 90.0, + -7.59 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.6, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 0.0 + ], + [ + 45.0, + 0.0 + ], + [ + 90.0, + 0.63 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + -2.0 + ], + [ + 0.401235, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ], + "tilt_declination": [ + [ + 0.0, + 0.0 + ], + [ + 45.0, + 0.0 + ], + [ + 90.0, + -1.6 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + 0.510417 + ], + [ + 1.0, + -1.0 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/impressionism_prev.png b/stuff/library/mypaint brushes/classic/impressionism_prev.png new file mode 100644 index 0000000..e4d9fa1 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/impressionism_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/ink_blot.myb b/stuff/library/mypaint brushes/classic/ink_blot.myb new file mode 100644 index 0000000..aa84316 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/ink_blot.myb @@ -0,0 +1,191 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/ink_blot", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.32, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 15.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.28, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.17, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.13, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.63, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.5, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/ink_blot_prev.png b/stuff/library/mypaint brushes/classic/ink_blot_prev.png new file mode 100644 index 0000000..5f8f68c Binary files /dev/null and b/stuff/library/mypaint brushes/classic/ink_blot_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/ink_eraser.myb b/stuff/library/mypaint brushes/classic/ink_eraser.myb new file mode 100644 index 0000000..e8527ba --- /dev/null +++ b/stuff/library/mypaint brushes/classic/ink_eraser.myb @@ -0,0 +1,241 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 1.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.025, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.16, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.21 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/ink_eraser_prev.png b/stuff/library/mypaint brushes/classic/ink_eraser_prev.png new file mode 100644 index 0000000..1325e99 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/ink_eraser_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/kabura.myb b/stuff/library/mypaint brushes/classic/kabura.myb new file mode 100644 index 0000000..499f273 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/kabura.myb @@ -0,0 +1,266 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/kabura", + "settings": { + "anti_aliasing": { + "base_value": 0.93, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 3.24, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 48.87, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.43, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.29, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.29, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.92, + "inputs": { + "pressure": [ + [ + 0.0, + -0.7875 + ], + [ + 0.237952, + -0.6 + ], + [ + 0.5, + -0.15 + ], + [ + 0.76506, + 0.6 + ], + [ + 1.0, + 0.9 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 10.0, + "inputs": { + "speed1": [ + [ + 0.0, + -1.428571 + ], + [ + 4.0, + 10.0 + ] + ], + "speed2": [ + [ + 0.0, + -1.428571 + ], + [ + 4.0, + 10.0 + ] + ] + } + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/kabura_prev.png b/stuff/library/mypaint brushes/classic/kabura_prev.png new file mode 100644 index 0000000..17335f9 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/kabura_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/knife.myb b/stuff/library/mypaint brushes/classic/knife.myb new file mode 100644 index 0000000..126e25a --- /dev/null +++ b/stuff/library/mypaint brushes/classic/knife.myb @@ -0,0 +1,202 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/knife", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.75, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.99, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 6.52, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.9, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.26, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/knife_prev.png b/stuff/library/mypaint brushes/classic/knife_prev.png new file mode 100644 index 0000000..535976c Binary files /dev/null and b/stuff/library/mypaint brushes/classic/knife_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/long_grass.myb b/stuff/library/mypaint brushes/classic/long_grass.myb new file mode 100644 index 0000000..d492355 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/long_grass.myb @@ -0,0 +1,358 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/long_grass", + "settings": { + "anti_aliasing": { + "base_value": 5.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.05 + ], + [ + 1.0, + 0.05 + ] + ], + "stroke": [ + [ + 0.0, + -0.004687 + ], + [ + 1.0, + 0.004792 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.01 + ], + [ + 1.0, + 0.01 + ] + ] + } + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.173333 + ], + [ + 1.0, + 0.26 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.09 + ], + [ + 1.0, + 0.09 + ] + ], + "stroke": [ + [ + 0.0, + -0.13 + ], + [ + 0.5, + 0.13 + ], + [ + 1.0, + -0.128646 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 1.06, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 24.08, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 78.896104, + 21.41 + ], + [ + 102.272727, + -21.41 + ], + [ + 180.0, + 0.0 + ] + ], + "random": [ + [ + 0.0, + -13.31 + ], + [ + 0.11039, + -1.525104 + ], + [ + 0.899351, + 1.66375 + ], + [ + 1.0, + 13.31 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 3.81, + "inputs": { + "random": [ + [ + 0.0, + 2.575 + ], + [ + 0.092593, + 4.345313 + ], + [ + 1.0, + 5.15 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.74, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -1.78 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 4.0, + 0.2 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.1, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.83, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.083333, + 0.68 + ], + [ + 1.0, + 0.68 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.8, + "inputs": { + "random": [ + [ + 0.0, + -0.11 + ], + [ + 1.0, + 0.11 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.2, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 5.96, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/long_grass_prev.png b/stuff/library/mypaint brushes/classic/long_grass_prev.png new file mode 100644 index 0000000..cd5a4a3 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/long_grass_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/marker_fat.myb b/stuff/library/mypaint brushes/classic/marker_fat.myb new file mode 100644 index 0000000..509c7c2 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/marker_fat.myb @@ -0,0 +1,236 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/marker_fat", + "settings": { + "anti_aliasing": { + "base_value": 0.78, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 1.5, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 113.08, + "inputs": { + "tilt_ascension": [ + [ + -180.0, + -180.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + -0.0 + ], + [ + 68.042169, + -9.0 + ], + [ + 90.0, + -9.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.060241, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.48, + "inputs": { + "tilt_declination": [ + [ + 20.0, + -0.0 + ], + [ + 50.0, + -0.0 + ], + [ + 80.0, + -1.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 3.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/marker_fat_prev.png b/stuff/library/mypaint brushes/classic/marker_fat_prev.png new file mode 100644 index 0000000..5d99b17 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/marker_fat_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/marker_small.myb b/stuff/library/mypaint brushes/classic/marker_small.myb new file mode 100644 index 0000000..281d2c4 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/marker_small.myb @@ -0,0 +1,236 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/marker_small", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 113.08, + "inputs": { + "tilt_ascension": [ + [ + -180.0, + -180.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 8.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + -0.0 + ], + [ + 68.042169, + -9.0 + ], + [ + 90.0, + -9.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.060241, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.0, + "inputs": { + "tilt_declination": [ + [ + 20.0, + -0.0 + ], + [ + 50.0, + -0.0 + ], + [ + 80.0, + -0.8 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 3.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/marker_small_prev.png b/stuff/library/mypaint brushes/classic/marker_small_prev.png new file mode 100644 index 0000000..3834028 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/marker_small_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/modelling.myb b/stuff/library/mypaint brushes/classic/modelling.myb new file mode 100644 index 0000000..348f93e --- /dev/null +++ b/stuff/library/mypaint brushes/classic/modelling.myb @@ -0,0 +1,260 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/modelling", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.02, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.71, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.8, + "inputs": { + "speed2": [ + [ + 0.0, + 0.28 + ], + [ + 0.518519, + 0.032083 + ], + [ + 1.888889, + -0.16625 + ], + [ + 4.0, + -0.28 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.52 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.1, + "inputs": { + "pressure": [ + [ + 0.0, + 0.326667 + ], + [ + 1.0, + -0.49 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.75 + ] + ], + "speed2": [ + [ + 0.0, + -0.15 + ], + [ + 4.0, + 1.05 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.25, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.290123, + -0.0375 + ], + [ + 0.645062, + -0.15 + ], + [ + 1.0, + -0.4 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.3, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 1.24, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.1, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.61, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/modelling2.myb b/stuff/library/mypaint brushes/classic/modelling2.myb new file mode 100644 index 0000000..3e08e75 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/modelling2.myb @@ -0,0 +1,373 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1836514917, + "inputs": {} + }, + "color_s": { + "base_value": 0.721940404399, + "inputs": {} + }, + "color_v": { + "base_value": 0.860303654536, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.67, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.79, + "inputs": { + "pressure": [ + [ + 0.0, + -0.25 + ], + [ + 0.133929, + -0.195312 + ], + [ + 0.223214, + -0.109375 + ], + [ + 0.342262, + -0.028646 + ], + [ + 0.5, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + 0.0 + ], + [ + 0.164336, + 0.0 + ], + [ + 0.213287, + 0.19 + ], + [ + 0.265734, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.43, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.78 + ], + [ + 0.02381, + 0.0 + ], + [ + 0.061728, + 0.2275 + ], + [ + 0.732143, + 0.706875 + ], + [ + 1.0, + 0.78 + ] + ], + "speed1": [ + [ + 0.0, + -0.27 + ], + [ + 3.0, + -0.2475 + ] + ], + "speed2": [ + [ + 0.0, + -0.37 + ], + [ + 0.357143, + -0.23125 + ], + [ + 0.845238, + -0.131042 + ], + [ + 1.77381, + -0.034687 + ], + [ + 2.77381, + 0.0 + ], + [ + 4.0, + 0.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.404321, + -0.0875 + ], + [ + 1.0, + -0.42 + ] + ], + "speed1": [ + [ + 0.0, + -0.201429 + ], + [ + 4.0, + 1.41 + ] + ], + "speed2": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.42 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.53, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.299383, + -0.0125 + ], + [ + 0.5, + -0.0375 + ], + [ + 0.790123, + -0.110417 + ], + [ + 1.0, + -0.2 + ] + ], + "stroke": [ + [ + 0.0, + -0.65 + ], + [ + 0.132716, + -0.561979 + ], + [ + 0.358025, + -0.473958 + ], + [ + 0.648148, + -0.24375 + ], + [ + 0.87037, + 0.067708 + ], + [ + 1.0, + 0.446875 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.63, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 0.98, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 5.22, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/modelling2_prev.png b/stuff/library/mypaint brushes/classic/modelling2_prev.png new file mode 100644 index 0000000..179c84d Binary files /dev/null and b/stuff/library/mypaint brushes/classic/modelling2_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/modelling_prev.png b/stuff/library/mypaint brushes/classic/modelling_prev.png new file mode 100644 index 0000000..5ec6c93 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/modelling_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/pen.myb b/stuff/library/mypaint brushes/classic/pen.myb new file mode 100644 index 0000000..6057896 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/pen.myb @@ -0,0 +1,241 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/pen", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.015, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.96, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.21 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/pen_prev.png b/stuff/library/mypaint brushes/classic/pen_prev.png new file mode 100644 index 0000000..b87e248 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/pen_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/pencil.myb b/stuff/library/mypaint brushes/classic/pencil.myb new file mode 100644 index 0000000..2878434 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/pencil.myb @@ -0,0 +1,213 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/pencil", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.1, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.7, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.2, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/pencil_prev.png b/stuff/library/mypaint brushes/classic/pencil_prev.png new file mode 100644 index 0000000..6e618eb Binary files /dev/null and b/stuff/library/mypaint brushes/classic/pencil_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/pointy_ink.myb b/stuff/library/mypaint brushes/classic/pointy_ink.myb new file mode 100644 index 0000000..d6e77be --- /dev/null +++ b/stuff/library/mypaint brushes/classic/pointy_ink.myb @@ -0,0 +1,267 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/pointy_ink", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.65 + ] + ], + "speed1": [ + [ + 0.0, + 0.064687 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.015, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.96, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 3.36 + ] + ], + "speed1": [ + [ + 0.0, + 0.14875 + ], + [ + 1.0, + -0.21 + ] + ], + "stroke": [ + [ + 0.0, + -0.62 + ], + [ + 0.157407, + -0.393958 + ], + [ + 0.29321, + -0.238958 + ], + [ + 0.5, + -0.148542 + ], + [ + 0.700617, + -0.064583 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.18, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/pointy_ink_prev.png b/stuff/library/mypaint brushes/classic/pointy_ink_prev.png new file mode 100644 index 0000000..1b0aafa Binary files /dev/null and b/stuff/library/mypaint brushes/classic/pointy_ink_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/puantilism.myb b/stuff/library/mypaint brushes/classic/puantilism.myb new file mode 100644 index 0000000..dd6db48 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/puantilism.myb @@ -0,0 +1,346 @@ +{ + "comment": "MyPaint brush file", + "group": "oil", + "parent_brush_name": "classic/puantilism", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "custom": [ + [ + -2.0, + -0.04 + ], + [ + 2.0, + 0.04 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.87963, + 0.02 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -10.0 + ], + [ + 1.0, + 10.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 4.41 + ], + [ + 90.0, + 0.0 + ] + ] + } + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 6.11 + ], + [ + 90.0, + 0.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + -0.0 + ], + [ + 45.0, + -0.0 + ], + [ + 90.0, + -0.83 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.42, + "inputs": { + "pressure": [ + [ + 0.0, + -2.0 + ], + [ + 0.401235, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + 0.510417 + ], + [ + 1.0, + -1.0 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/puantilism2.myb b/stuff/library/mypaint brushes/classic/puantilism2.myb new file mode 100644 index 0000000..5fc0029 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/puantilism2.myb @@ -0,0 +1,382 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/puantilism2", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "custom": [ + [ + -2.0, + -0.04 + ], + [ + 2.0, + 0.04 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.21 + ], + [ + 1.0, + 0.21 + ] + ] + } + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.87963, + 0.02 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.1 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -10.0 + ], + [ + 1.0, + 10.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 4.41 + ], + [ + 90.0, + 0.0 + ] + ] + } + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "tilt_ascension": [ + [ + -180.0, + -180.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": { + "tilt_declination": [ + [ + 0.0, + 4.6 + ], + [ + 90.0, + -0.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.06, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.57561, + 0.428958 + ], + [ + 1.0, + 1.42 + ] + ], + "tilt_declination": [ + [ + 0.0, + -0.0 + ], + [ + 45.0, + -0.0 + ], + [ + 90.0, + -0.83 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.02, + "inputs": { + "pressure": [ + [ + 0.0, + -2.0 + ], + [ + 0.401235, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + 0.510417 + ], + [ + 1.0, + -1.0 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/puantilism2_prev.png b/stuff/library/mypaint brushes/classic/puantilism2_prev.png new file mode 100644 index 0000000..399c093 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/puantilism2_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/puantilism_prev.png b/stuff/library/mypaint brushes/classic/puantilism_prev.png new file mode 100644 index 0000000..306b4dd Binary files /dev/null and b/stuff/library/mypaint brushes/classic/puantilism_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/rounded.myb b/stuff/library/mypaint brushes/classic/rounded.myb new file mode 100644 index 0000000..5295d7e --- /dev/null +++ b/stuff/library/mypaint brushes/classic/rounded.myb @@ -0,0 +1,221 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.116482286819, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 167.14, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "custom": [ + [ + -2.0, + 0.0 + ], + [ + -0.703704, + 0.007292 + ], + [ + 0.469136, + 0.027083 + ], + [ + 2.0, + 0.1 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.69, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 2.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.3, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.08, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.06, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/rounded_prev.png b/stuff/library/mypaint brushes/classic/rounded_prev.png new file mode 100644 index 0000000..6c706a7 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/rounded_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/short_grass.myb b/stuff/library/mypaint brushes/classic/short_grass.myb new file mode 100644 index 0000000..1521fbe --- /dev/null +++ b/stuff/library/mypaint brushes/classic/short_grass.myb @@ -0,0 +1,289 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/short_grass", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.05 + ], + [ + 1.0, + 0.05 + ] + ], + "stroke": [ + [ + 0.0, + -0.004687 + ], + [ + 1.0, + 0.004792 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.01 + ], + [ + 1.0, + 0.01 + ] + ] + } + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.28 + ], + [ + 1.0, + 0.28 + ] + ], + "stroke": [ + [ + 0.0, + -0.23 + ], + [ + 0.5, + 0.23 + ], + [ + 1.0, + -0.227604 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -36.46 + ], + [ + 0.11039, + -4.177708 + ], + [ + 0.899351, + 4.5575 + ], + [ + 1.0, + 36.46 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 3.91, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.91, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.79, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -1.4 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.78, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.56, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.5, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 5.96, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/short_grass_prev.png b/stuff/library/mypaint brushes/classic/short_grass_prev.png new file mode 100644 index 0000000..181375d Binary files /dev/null and b/stuff/library/mypaint brushes/classic/short_grass_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/slow_ink.myb b/stuff/library/mypaint brushes/classic/slow_ink.myb new file mode 100644 index 0000000..7452fa8 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/slow_ink.myb @@ -0,0 +1,241 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/slow_ink", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.06 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.1 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.191358, + 0.0 + ], + [ + 0.200617, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.37, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 8.64, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 1.44, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.11, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/slow_ink_prev.png b/stuff/library/mypaint brushes/classic/slow_ink_prev.png new file mode 100644 index 0000000..29dbeb9 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/slow_ink_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/smudge+paint.myb b/stuff/library/mypaint brushes/classic/smudge+paint.myb new file mode 100644 index 0000000..bf747b6 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/smudge+paint.myb @@ -0,0 +1,263 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.66, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.32, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.64, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.077381, + 0.197917 + ], + [ + 0.229167, + 0.385417 + ], + [ + 0.589286, + 0.510417 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.4 + ], + [ + 1.0, + -0.6 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 1.0 + ], + [ + 0.219136, + 1.0 + ], + [ + 0.333333, + 0.895833 + ], + [ + 0.5, + 0.510417 + ], + [ + 0.759259, + 0.15625 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.28, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/smudge+paint_prev.png b/stuff/library/mypaint brushes/classic/smudge+paint_prev.png new file mode 100644 index 0000000..261ef9a Binary files /dev/null and b/stuff/library/mypaint brushes/classic/smudge+paint_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/smudge.myb b/stuff/library/mypaint brushes/classic/smudge.myb new file mode 100644 index 0000000..876fdd1 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/smudge.myb @@ -0,0 +1,213 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/smudge", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.6, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.35, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/smudge_prev.png b/stuff/library/mypaint brushes/classic/smudge_prev.png new file mode 100644 index 0000000..e9e08ee Binary files /dev/null and b/stuff/library/mypaint brushes/classic/smudge_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/textured_ink.myb b/stuff/library/mypaint brushes/classic/textured_ink.myb new file mode 100644 index 0000000..30588b5 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/textured_ink.myb @@ -0,0 +1,228 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/textured_ink", + "settings": { + "anti_aliasing": { + "base_value": 0.61, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.4 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.055556, + 0.895833 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.1, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.9, + "inputs": { + "speed2": [ + [ + 0.0, + 0.042857 + ], + [ + 4.0, + -0.3 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/textured_ink_prev.png b/stuff/library/mypaint brushes/classic/textured_ink_prev.png new file mode 100644 index 0000000..2affba5 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/textured_ink_prev.png differ diff --git a/stuff/library/mypaint brushes/classic/wet_knife.myb b/stuff/library/mypaint brushes/classic/wet_knife.myb new file mode 100644 index 0000000..dfafb98 --- /dev/null +++ b/stuff/library/mypaint brushes/classic/wet_knife.myb @@ -0,0 +1,221 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classic/wet_knife", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.71, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.75, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.99, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 6.52, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.117284, + 0.635417 + ], + [ + 0.330247, + 0.9375 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.3, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/classic/wet_knife_prev.png b/stuff/library/mypaint brushes/classic/wet_knife_prev.png new file mode 100644 index 0000000..2e3e641 Binary files /dev/null and b/stuff/library/mypaint brushes/classic/wet_knife_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/2B_pencil.myb b/stuff/library/mypaint brushes/deevad/2B_pencil.myb new file mode 100644 index 0000000..5743745 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/2B_pencil.myb @@ -0,0 +1,230 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A digital pencil soft 2B", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.02525252525252525, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.15000000000027122, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.75, + "inputs": { + "pressure": [ + [ + 0.0, + -0.687917 + ], + [ + 0.752976, + 0.236471 + ], + [ + 1.0, + 0.286632 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.03, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 1.5, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/2B_pencil_prev.png b/stuff/library/mypaint brushes/deevad/2B_pencil_prev.png new file mode 100644 index 0000000..73d3a99 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/2B_pencil_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/4H_pencil.myb b/stuff/library/mypaint brushes/deevad/4H_pencil.myb new file mode 100644 index 0000000..4020e5a --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/4H_pencil.myb @@ -0,0 +1,230 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A digital pencil hard 4H", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.370962081331, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.0257201646091, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.75, + "inputs": { + "pressure": [ + [ + 0.0, + -0.687917 + ], + [ + 0.752976, + 0.236471 + ], + [ + 1.0, + 0.286632 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/4H_pencil_prev.png b/stuff/library/mypaint brushes/deevad/4H_pencil_prev.png new file mode 100644 index 0000000..1a5b4e7 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/4H_pencil_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/airbrush.myb b/stuff/library/mypaint brushes/deevad/airbrush.myb new file mode 100644 index 0000000..cf2dc1e --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/airbrush.myb @@ -0,0 +1,234 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "An airbrush", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.08902229845626071, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.71, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.75, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.99, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.48, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.52, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 2.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.111111, + 0.5 + ], + [ + 0.308642, + 0.833333 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 4.7, + "inputs": { + "custom": [ + [ + -2.0, + 0.45 + ], + [ + 2.0, + -0.45 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/airbrush_prev.png b/stuff/library/mypaint brushes/deevad/airbrush_prev.png new file mode 100644 index 0000000..188ebaa Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/airbrush_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/ballpen.myb b/stuff/library/mypaint brushes/deevad/ballpen.myb new file mode 100644 index 0000000..9977957 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/ballpen.myb @@ -0,0 +1,236 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A ballpen", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.354167 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.2, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.17 + ] + ], + "speed2": [ + [ + 0.0, + -0.0 + ], + [ + 4.0, + -0.04 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/ballpen_prev.png b/stuff/library/mypaint brushes/deevad/ballpen_prev.png new file mode 100644 index 0000000..d74140f Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/ballpen_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/basic_digital_brush.myb b/stuff/library/mypaint brushes/deevad/basic_digital_brush.myb new file mode 100644 index 0000000..4c54a14 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/basic_digital_brush.myb @@ -0,0 +1,273 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A basic rounded digital brush", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 2.3, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.02525252525252525, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 4.63, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 2.54152805533e-05, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.2875, + 0.0625 + ], + [ + 0.645, + 0.19791666666666663 + ], + [ + 0.875, + 0.65625 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.080645, + 0.072917 + ], + [ + 0.154839, + 0.291667 + ], + [ + 0.21129, + 0.458333 + ], + [ + 0.285484, + 0.760417 + ], + [ + 0.348387, + 0.947917 + ], + [ + 0.416129, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.02, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/basic_digital_brush_prev.png b/stuff/library/mypaint brushes/deevad/basic_digital_brush_prev.png new file mode 100644 index 0000000..75a6a40 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/basic_digital_brush_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/basic_digital_brush_smudging.myb b/stuff/library/mypaint brushes/deevad/basic_digital_brush_smudging.myb new file mode 100644 index 0000000..1030200 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/basic_digital_brush_smudging.myb @@ -0,0 +1,257 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A basic rounded brush able to smudge color", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.020849858356940493, + "inputs": {} + }, + "color_s": { + "base_value": 0.9613289760348583, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.87, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.48, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -1.0 + ], + [ + 0.61129, + -0.916667 + ], + [ + 0.825806, + -0.614583 + ], + [ + 0.958065, + 0.166667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.052469, + 0.625 + ], + [ + 0.166667, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.9000000000000012, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.91, + "inputs": { + "pressure": [ + [ + 0.0, + 0.286667 + ], + [ + 1.0, + -0.43 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/basic_digital_brush_smudging_prev.png b/stuff/library/mypaint brushes/deevad/basic_digital_brush_smudging_prev.png new file mode 100644 index 0000000..dfc1f03 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/basic_digital_brush_smudging_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/basic_digital_knife.myb b/stuff/library/mypaint brushes/deevad/basic_digital_knife.myb new file mode 100644 index 0000000..650dd5b --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/basic_digital_knife.myb @@ -0,0 +1,273 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A flat brush attempting to emulate a paint-knife", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 2.3, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.07983276469913346, + "inputs": {} + }, + "color_s": { + "base_value": 0.8515061518879932, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 4.63, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 159.91, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 3.61, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 2.54152805533e-05, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.2875, + 0.0625 + ], + [ + 0.645, + 0.19791666666666663 + ], + [ + 0.875, + 0.65625 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.080645, + 0.072917 + ], + [ + 0.154839, + 0.291667 + ], + [ + 0.21129, + 0.458333 + ], + [ + 0.285484, + 0.760417 + ], + [ + 0.348387, + 0.947917 + ], + [ + 0.416129, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.02, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/basic_digital_knife_prev.png b/stuff/library/mypaint brushes/deevad/basic_digital_knife_prev.png new file mode 100644 index 0000000..3b06ffe Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/basic_digital_knife_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/basic_digital_knife_smudging.myb b/stuff/library/mypaint brushes/deevad/basic_digital_knife_smudging.myb new file mode 100644 index 0000000..31b1b3e --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/basic_digital_knife_smudging.myb @@ -0,0 +1,246 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A flat brush attempting to emulate a paint-knife with smudging", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 4.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.07983276469913346, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 159.91, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 3.61, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.48, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -1.0 + ], + [ + 0.61129, + -0.916667 + ], + [ + 0.825806, + -0.614583 + ], + [ + 0.958065, + 0.166667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.052469, + 0.625 + ], + [ + 0.166667, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.25, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.91, + "inputs": { + "pressure": [ + [ + 0.0, + 0.286667 + ], + [ + 1.0, + -0.43 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/basic_digital_knife_smudging_prev.png b/stuff/library/mypaint brushes/deevad/basic_digital_knife_smudging_prev.png new file mode 100644 index 0000000..626abe4 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/basic_digital_knife_smudging_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/blending.myb b/stuff/library/mypaint brushes/deevad/blending.myb new file mode 100644 index 0000000..d06a937 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/blending.myb @@ -0,0 +1,215 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A brush to blend colors on canvas", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.07582697201017817, + "inputs": {} + }, + "color_s": { + "base_value": 0.13795282224094355, + "inputs": {} + }, + "color_v": { + "base_value": 0.5172113289760348, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.04, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.58, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.558, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.95, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.54, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/blending_prev.png b/stuff/library/mypaint brushes/deevad/blending_prev.png new file mode 100644 index 0000000..8b05d04 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/blending_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/brush.myb b/stuff/library/mypaint brushes/deevad/brush.myb new file mode 100644 index 0000000..2c37c30 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/brush.myb @@ -0,0 +1,231 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A brush changing diameters depending on pressure", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.43, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + -0.69125 + ], + [ + 0.453947, + -0.576042 + ], + [ + 0.723684, + -0.156354 + ], + [ + 1.0, + 0.090521 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.015, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.52, + "inputs": { + "pressure": [ + [ + 0.0, + -0.859375 + ], + [ + 1.0, + 1.5 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/brush_prev.png b/stuff/library/mypaint brushes/deevad/brush_prev.png new file mode 100644 index 0000000..17725ba Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/brush_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/chalk.myb b/stuff/library/mypaint brushes/deevad/chalk.myb new file mode 100644 index 0000000..c3e8d95 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/chalk.myb @@ -0,0 +1,250 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A chalk brush attempt, using many tiny particles on canvas to simulate grain", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.69, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.93, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 5.07, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.67, + "inputs": { + "pressure": [ + [ + 0.0, + -0.4 + ], + [ + 0.667722, + -0.0625 + ], + [ + 1.0, + 0.6 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -2.0 + ] + ], + "speed1": [ + [ + 0.0, + -0.25 + ], + [ + 4.0, + 1.75 + ] + ], + "speed2": [ + [ + 0.0, + -0.25 + ], + [ + 4.0, + 1.75 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.58, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/chalk_prev.png b/stuff/library/mypaint brushes/deevad/chalk_prev.png new file mode 100644 index 0000000..a4927ba Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/chalk_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/detail_brush_large.myb b/stuff/library/mypaint brushes/deevad/detail_brush_large.myb new file mode 100644 index 0000000..19c4f89 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/detail_brush_large.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "Part of a subset of detailing brush: large one", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.9958605664488018, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.09, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.21, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/detail_brush_large_glazing.myb b/stuff/library/mypaint brushes/deevad/detail_brush_large_glazing.myb new file mode 100644 index 0000000..48fcc1b --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/detail_brush_large_glazing.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "Part of a subset of detailing brush: large glazing one", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.9958605664488018, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.0277777777778, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.21, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/detail_brush_large_glazing_prev.png b/stuff/library/mypaint brushes/deevad/detail_brush_large_glazing_prev.png new file mode 100644 index 0000000..be79809 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/detail_brush_large_glazing_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/detail_brush_large_prev.png b/stuff/library/mypaint brushes/deevad/detail_brush_large_prev.png new file mode 100644 index 0000000..a075e4e Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/detail_brush_large_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/detail_brush_thin.myb b/stuff/library/mypaint brushes/deevad/detail_brush_thin.myb new file mode 100644 index 0000000..a61adfa --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/detail_brush_thin.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "Part of a subset of detailing brush: thin one", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.2870959298521136, + "inputs": {} + }, + "color_s": { + "base_value": 0.8021541950113379, + "inputs": {} + }, + "color_v": { + "base_value": 0.2422522316319524, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.09, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.42, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/detail_brush_thin_glazing.myb b/stuff/library/mypaint brushes/deevad/detail_brush_thin_glazing.myb new file mode 100644 index 0000000..795460d --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/detail_brush_thin_glazing.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "Part of a subset of detailing brush: thin glazing one", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.03, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.43, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/detail_brush_thin_glazing_prev.png b/stuff/library/mypaint brushes/deevad/detail_brush_thin_glazing_prev.png new file mode 100644 index 0000000..546ac3a Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/detail_brush_thin_glazing_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/detail_brush_thin_prev.png b/stuff/library/mypaint brushes/deevad/detail_brush_thin_prev.png new file mode 100644 index 0000000..d6d45a1 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/detail_brush_thin_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/fill.myb b/stuff/library/mypaint brushes/deevad/fill.myb new file mode 100644 index 0000000..1482ad7 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/fill.myb @@ -0,0 +1,223 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A big flat brush to fill color areas", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + -0.013542 + ], + [ + 1.0, + 0.13 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.025, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.7, + "inputs": { + "pressure": [ + [ + 0.0, + -0.68 + ], + [ + 1.0, + 1.02 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/fill_prev.png b/stuff/library/mypaint brushes/deevad/fill_prev.png new file mode 100644 index 0000000..beb79e5 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/fill_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/grainy_blending.myb b/stuff/library/mypaint brushes/deevad/grainy_blending.myb new file mode 100644 index 0000000..99d97c1 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/grainy_blending.myb @@ -0,0 +1,204 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A blending tool with particles to simulate the grain of paper.", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "grainy_blending", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 5.49, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 42.38, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.15, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.62, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.17, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.05, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.6, + "inputs": {} + }, + "restore_color": { + "base_value": 1.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.95, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 1.45, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/grainy_blending_prev.png b/stuff/library/mypaint brushes/deevad/grainy_blending_prev.png new file mode 100644 index 0000000..2aa178e Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/grainy_blending_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/kneaded_eraser.myb b/stuff/library/mypaint brushes/deevad/kneaded_eraser.myb new file mode 100644 index 0000000..7858f9c --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/kneaded_eraser.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A soft eraser", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 2.32, + "inputs": {} + }, + "eraser": { + "base_value": 1.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.09, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.32, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/kneaded_eraser_large.myb b/stuff/library/mypaint brushes/deevad/kneaded_eraser_large.myb new file mode 100644 index 0000000..98d30f8 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/kneaded_eraser_large.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A large and soft eraser", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 2.32, + "inputs": {} + }, + "eraser": { + "base_value": 1.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.09, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.72, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/kneaded_eraser_large_prev.png b/stuff/library/mypaint brushes/deevad/kneaded_eraser_large_prev.png new file mode 100644 index 0000000..cff0037 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/kneaded_eraser_large_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/kneaded_eraser_prev.png b/stuff/library/mypaint brushes/deevad/kneaded_eraser_prev.png new file mode 100644 index 0000000..0d83136 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/kneaded_eraser_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/large_hard_eraser.myb b/stuff/library/mypaint brushes/deevad/large_hard_eraser.myb new file mode 100644 index 0000000..5e8ad48 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/large_hard_eraser.myb @@ -0,0 +1,224 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A rubber eraser", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 1.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.025, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.31, + "inputs": { + "pressure": [ + [ + 0.0, + -0.255937 + ], + [ + 0.544304, + 0.060938 + ], + [ + 0.857595, + 0.402187 + ], + [ + 0.939873, + 0.743438 + ], + [ + 1.0, + 1.17 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/large_hard_eraser_prev.png b/stuff/library/mypaint brushes/deevad/large_hard_eraser_prev.png new file mode 100644 index 0000000..b8d8d68 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/large_hard_eraser_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/large_watercolor_fringe.myb b/stuff/library/mypaint brushes/deevad/large_watercolor_fringe.myb new file mode 100644 index 0000000..cc02d99 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/large_watercolor_fringe.myb @@ -0,0 +1,230 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A brush attempt to simulate the fringe of watercolor diffusion", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "large_watercolor_fringe", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.041632116586268926, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 4.39, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 6.99, + "inputs": {} + }, + "direction_filter": { + "base_value": 1.68, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "random": [ + [ + 0.0, + -1.9 + ], + [ + 1.0, + 1.9 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.17146776406, + "inputs": { + "pressure": [ + [ + 0.0, + 0.81 + ], + [ + 1.0, + 0.81 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.058642, + 0.604167 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.8000000000000007, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.75, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.7, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": -0.8, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.9, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/large_watercolor_fringe_prev.png b/stuff/library/mypaint brushes/deevad/large_watercolor_fringe_prev.png new file mode 100644 index 0000000..624e127 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/large_watercolor_fringe_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/liner.myb b/stuff/library/mypaint brushes/deevad/liner.myb new file mode 100644 index 0000000..5290851 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/liner.myb @@ -0,0 +1,201 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A small brush to trace regular lines", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 2.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1289192800566187, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.43, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.015, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.7999999999999998, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.18, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/liner_prev.png b/stuff/library/mypaint brushes/deevad/liner_prev.png new file mode 100644 index 0000000..d308434 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/liner_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/only_water_fringe.myb b/stuff/library/mypaint brushes/deevad/only_water_fringe.myb new file mode 100644 index 0000000..9d13534 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/only_water_fringe.myb @@ -0,0 +1,230 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A brush attempt to simulate the fringe of watercolor diffusion, only smudging", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.9782674701892076, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 4.39, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 6.99, + "inputs": {} + }, + "direction_filter": { + "base_value": 1.68, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "random": [ + [ + 0.0, + -1.9 + ], + [ + 1.0, + 1.9 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.17146776406, + "inputs": { + "pressure": [ + [ + 0.0, + 0.81 + ], + [ + 1.0, + 0.81 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.058642, + 0.604167 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.8000000000000007, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.7, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": -0.8, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.9, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/only_water_fringe_prev.png b/stuff/library/mypaint brushes/deevad/only_water_fringe_prev.png new file mode 100644 index 0000000..19563bd Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/only_water_fringe_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/pen-note.myb b/stuff/library/mypaint brushes/deevad/pen-note.myb new file mode 100644 index 0000000..5ccd659 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/pen-note.myb @@ -0,0 +1,243 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A pen to write notes", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "deevad/pen", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1289192800566187, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.39, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.07 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.015, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.6699999999999999, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.21 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/pen-note_prev.png b/stuff/library/mypaint brushes/deevad/pen-note_prev.png new file mode 100644 index 0000000..1846938 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/pen-note_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/pen.myb b/stuff/library/mypaint brushes/deevad/pen.myb new file mode 100644 index 0000000..0f23bab --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/pen.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A pen to draw and sketch", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.0899999999998, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.72, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.326923, + -0.320312 + ], + [ + 0.717949, + 0.046875 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.03, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 1.52, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/pen_prev.png b/stuff/library/mypaint brushes/deevad/pen_prev.png new file mode 100644 index 0000000..660a32c Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/pen_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/readme.txt b/stuff/library/mypaint brushes/deevad/readme.txt new file mode 100644 index 0000000..ca68ce3 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/readme.txt @@ -0,0 +1,24 @@ + __//| +/oo | +\mm\_ . . . . . . . D E E V A D brushkit V6 . . . . . . . . . . . . . . . . . . . . . . + +This is Deevad's brushset version 6 done for Mypaint version 1.1.0 +This brush kit is released in public domain, so feel free to create +what you want with it. + +If you accept this license, a new brush group named 'deevad-v6' will +be created. More infos on the brushes on my blog, or my deviant-art +account , under the ressources category. + +Released in end october 2012 + + +########################################### +### WARNING ! INCOMPATIBLE WITH MYPAINT 1.0.0 AND BEFORE ### +########################################### + +Creative Commons Zero +Public Domain + +Website and blog : http://www.davidrevoy.com +deviantART : http://deevad.deviantart.com/ \ No newline at end of file diff --git a/stuff/library/mypaint brushes/deevad/rigger_brush.myb b/stuff/library/mypaint brushes/deevad/rigger_brush.myb new file mode 100644 index 0000000..624c4b9 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/rigger_brush.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A brush for small details", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.2916, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.36, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/rigger_brush_prev.png b/stuff/library/mypaint brushes/deevad/rigger_brush_prev.png new file mode 100644 index 0000000..6db91b1 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/rigger_brush_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/rigger_brush_thin.myb b/stuff/library/mypaint brushes/deevad/rigger_brush_thin.myb new file mode 100644 index 0000000..9077d61 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/rigger_brush_thin.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A brush for very small details", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.108920239366, + "inputs": {} + }, + "color_s": { + "base_value": 0.986088544326, + "inputs": {} + }, + "color_v": { + "base_value": 0.98608377203, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.55, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.57, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.12, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/rigger_brush_thin_prev.png b/stuff/library/mypaint brushes/deevad/rigger_brush_thin_prev.png new file mode 100644 index 0000000..16dc0a8 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/rigger_brush_thin_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/rough.myb b/stuff/library/mypaint brushes/deevad/rough.myb new file mode 100644 index 0000000..db0b8c0 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/rough.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A large low opacity brush to draw main shape and rough an artwork", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.07983276469913346, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.24, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 178.09, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.12 + ], + [ + 1.0, + -0.18 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.015432098765444446, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.302469, + 0.104167 + ], + [ + 0.546296, + 0.333333 + ], + [ + 0.688272, + 0.729167 + ], + [ + 0.814815, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.01, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.228395, + 0.054687 + ], + [ + 0.574074, + 0.515625 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.01, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 1.55, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/rough_prev.png b/stuff/library/mypaint brushes/deevad/rough_prev.png new file mode 100644 index 0000000..a1dbb92 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/rough_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/soft-dip-pen.myb b/stuff/library/mypaint brushes/deevad/soft-dip-pen.myb new file mode 100644 index 0000000..5998e5a --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/soft-dip-pen.myb @@ -0,0 +1,268 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A hard line with size variation for vigorous inking rendering", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.93, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.127540852929, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 3.24, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 48.87, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.43, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.29, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.29, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.92, + "inputs": { + "pressure": [ + [ + 0.0, + -0.7875 + ], + [ + 0.237952, + -0.6 + ], + [ + 0.5, + -0.15 + ], + [ + 0.76506, + 0.6 + ], + [ + 1.0, + 0.9 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 10.0, + "inputs": { + "speed1": [ + [ + 0.0, + -1.428571 + ], + [ + 4.0, + 10.0 + ] + ], + "speed2": [ + [ + 0.0, + -1.428571 + ], + [ + 4.0, + 10.0 + ] + ] + } + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/soft-dip-pen_prev.png b/stuff/library/mypaint brushes/deevad/soft-dip-pen_prev.png new file mode 100644 index 0000000..2d9f249 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/soft-dip-pen_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/sponge_smudging.myb b/stuff/library/mypaint brushes/deevad/sponge_smudging.myb new file mode 100644 index 0000000..6a4d0a5 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/sponge_smudging.myb @@ -0,0 +1,251 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "For smudging large area with a smooth texture", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.2336371488438775, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 6.1, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "stroke": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 3.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.45, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.33, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.13, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.033951, + 0.0625 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.0999999999999996, + "inputs": { + "pressure": [ + [ + 0.0, + -0.687917 + ], + [ + 1.0, + 0.568854 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 4.0, + 1.01 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/sponge_smudging_prev.png b/stuff/library/mypaint brushes/deevad/sponge_smudging_prev.png new file mode 100644 index 0000000..7653555 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/sponge_smudging_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/spray.myb b/stuff/library/mypaint brushes/deevad/spray.myb new file mode 100644 index 0000000..06d632e --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/spray.myb @@ -0,0 +1,234 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "Throw particles on the canvas, simulate spray bomb", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.95, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 3.92, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 74.55, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.43, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.62963, + 0.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.28, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.19, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.54321, + -1.82 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.83, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.47, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -1.55 + ] + ] + } + }, + "stroke_holdtime": { + "base_value": 1.44, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 1.36, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/spray2.myb b/stuff/library/mypaint brushes/deevad/spray2.myb new file mode 100644 index 0000000..31a5629 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/spray2.myb @@ -0,0 +1,245 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "Particles of paint have various size, to create splatter on the canvas", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.44, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 2.0 + ] + ], + "pressure": [ + [ + 0.0, + 2.0 + ], + [ + 1.0, + 2.0 + ] + ], + "speed2": [ + [ + 0.0, + -0.268571 + ], + [ + 4.0, + 1.88 + ] + ], + "stroke": [ + [ + 0.0, + 2.0 + ], + [ + 1.0, + 2.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 2.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.145833 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.95, + "inputs": { + "random": [ + [ + 0.0, + -0.98 + ], + [ + 1.0, + 0.98 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/spray2_prev.png b/stuff/library/mypaint brushes/deevad/spray2_prev.png new file mode 100644 index 0000000..0f92af7 Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/spray2_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/spray_prev.png b/stuff/library/mypaint brushes/deevad/spray_prev.png new file mode 100644 index 0000000..2447def Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/spray_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/thin_hard_eraser.myb b/stuff/library/mypaint brushes/deevad/thin_hard_eraser.myb new file mode 100644 index 0000000..c068e68 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/thin_hard_eraser.myb @@ -0,0 +1,224 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A thin hard eraser", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 1.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.025, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.21, + "inputs": { + "pressure": [ + [ + 0.0, + -0.255937 + ], + [ + 0.544304, + 0.060938 + ], + [ + 0.857595, + 0.402187 + ], + [ + 0.939873, + 0.743438 + ], + [ + 1.0, + 1.17 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/thin_hard_eraser_prev.png b/stuff/library/mypaint brushes/deevad/thin_hard_eraser_prev.png new file mode 100644 index 0000000..c039bbf Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/thin_hard_eraser_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/thin_watercolor.myb b/stuff/library/mypaint brushes/deevad/thin_watercolor.myb new file mode 100644 index 0000000..4f45d5a --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/thin_watercolor.myb @@ -0,0 +1,259 @@ +{ + "comment": "MyPaint brush file", + "description": "", + "group": "", + "description": "A thin brush to add detail in digital watercolour", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "notes": "", + "parent_brush_name": "deevad/thin_watercolor", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.1607843137254902, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "speed1": [ + [ + 0.0, + -7.5 + ], + [ + 0.962963, + -2.03125 + ], + [ + 4.0, + 0.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.76, + "inputs": { + "pressure": [ + [ + 0.0, + -0.044792 + ], + [ + 0.723684, + -0.147812 + ], + [ + 1.0, + -0.241875 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.17146776406, + "inputs": { + "pressure": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.058642, + 0.604167 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.9, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/thin_watercolor_prev.png b/stuff/library/mypaint brushes/deevad/thin_watercolor_prev.png new file mode 100644 index 0000000..b0267ad Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/thin_watercolor_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/watercolor_expressive.myb b/stuff/library/mypaint brushes/deevad/watercolor_expressive.myb new file mode 100644 index 0000000..3e38bee --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/watercolor_expressive.myb @@ -0,0 +1,322 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A brush with sensitivity on size while producing a fringe to simulate watercolor", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.150621805142, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 1.0, + -2.7 + ] + ], + "speed1": [ + [ + 0.0, + -0.7 + ], + [ + 4.0, + 0.7 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.23, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.746914, + -0.0 + ], + [ + 0.884375, + -0.0 + ], + [ + 1.0, + -0.032083 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 0.8 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 2.0, + "inputs": { + "random": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.040123, + 0.885417 + ], + [ + 0.138889, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.5, + "inputs": { + "pressure": [ + [ + 0.0, + -2.9 + ], + [ + 1.0, + 0.845833 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.71, + "inputs": { + "pressure": [ + [ + 0.0, + -0.65 + ], + [ + 0.5, + -0.358854 + ], + [ + 0.796875, + -0.094792 + ], + [ + 1.0, + 0.24375 + ] + ], + "speed1": [ + [ + 0.0, + -0.1 + ], + [ + 4.0, + 0.1 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.5, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/watercolor_expressive_prev.png b/stuff/library/mypaint brushes/deevad/watercolor_expressive_prev.png new file mode 100644 index 0000000..da9b8cb Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/watercolor_expressive_prev.png differ diff --git a/stuff/library/mypaint brushes/deevad/watercolor_glazing.myb b/stuff/library/mypaint brushes/deevad/watercolor_glazing.myb new file mode 100644 index 0000000..3382c08 --- /dev/null +++ b/stuff/library/mypaint brushes/deevad/watercolor_glazing.myb @@ -0,0 +1,253 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "description": "A watercolor brush preset to glaze area", + "notes": "A brush preset part of the Brushkit v0.6 \n created in october 2012 by David Revoy ( aka Deevad ) \n source: http://www.davidrevoy.com/article142/ressource-mypaint-brushes \n license: CC-Zero/Public-Domain", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0590291819643, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.874542195901, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "speed1": [ + [ + 0.0, + -7.5 + ], + [ + 0.962963, + -2.03125 + ], + [ + 4.0, + 0.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.41, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.44, + "inputs": { + "pressure": [ + [ + 0.0, + -0.43125 + ], + [ + 0.258721, + -0.277917 + ], + [ + 0.540698, + 0.0 + ], + [ + 1.0, + 0.92 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.058642, + 0.604167 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.6, + "inputs": { + "pressure": [ + [ + 0.0, + -0.653333 + ], + [ + 1.0, + 0.98 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.9, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} diff --git a/stuff/library/mypaint brushes/deevad/watercolor_glazing_prev.png b/stuff/library/mypaint brushes/deevad/watercolor_glazing_prev.png new file mode 100644 index 0000000..834144d Binary files /dev/null and b/stuff/library/mypaint brushes/deevad/watercolor_glazing_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/1pixel.myb b/stuff/library/mypaint brushes/experimental/1pixel.myb new file mode 100644 index 0000000..6d73d85 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/1pixel.myb @@ -0,0 +1,258 @@ +{ + "comment": "MyPaint brush file", + "description": "1-pixel brush for pixel art", + "group": "", + "notes": "Reduce Dabs Per Actual Radius to 0.03 for a hardedged dash annotation brush.\n\nThis one's fairly imperfect. notably has jags on curves compared to what Grafx2 or Gimp can produce. GIMP achieves its results via varying dab spacing according to rate of direction change, IIRC. Maybe a similar result could be achieved by a Direction curve for Dabs Per Actual radius, but I haven't managed it yet. In rare conditions experiences a 1px break in the line \u2014 I guess/hope that might also be fixable via a Dabs Per Actual Radius curve.", + "parent_brush_name": "experimental/1pixel", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.9, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 79.69, + "inputs": {} + }, + "direction_filter": { + "base_value": 10.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + -180.0 + ], + [ + 46.849315, + 180.0 + ], + [ + 90.0, + -180.0 + ], + [ + 136.232877, + 180.0 + ], + [ + 180.0, + -180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": { + "direction": [ + [ + 0.0, + -0.1 + ], + [ + 48.6, + 0.1 + ], + [ + 90.0, + -0.1 + ], + [ + 136.8, + 0.1 + ], + [ + 180.0, + -0.1 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": -0.58, + "inputs": { + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 4.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 1.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": -8.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.2, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 3.86, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/1pixel_prev.png b/stuff/library/mypaint brushes/experimental/1pixel_prev.png new file mode 100644 index 0000000..5a3c68e Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/1pixel_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/DNA_brush.myb b/stuff/library/mypaint brushes/experimental/DNA_brush.myb new file mode 100644 index 0000000..02f6be9 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/DNA_brush.myb @@ -0,0 +1,274 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/DNA_brush", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.246914, + 1.44 + ], + [ + 0.753086, + -1.44 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.1, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.66, + "inputs": { + "pressure": [ + [ + 0.0, + 0.891354 + ], + [ + 1.0, + 1.99 + ] + ], + "speed1": [ + [ + 0.0, + -2.61 + ], + [ + 4.0, + -2.61 + ] + ], + "speed2": [ + [ + 0.0, + -0.202857 + ], + [ + 4.0, + 1.42 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.59, + "inputs": { + "pressure": [ + [ + 0.0, + -1.753333 + ], + [ + 1.0, + 2.63 + ] + ] + } + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 6.36, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/DNA_brush_prev.png b/stuff/library/mypaint brushes/experimental/DNA_brush_prev.png new file mode 100644 index 0000000..c695e23 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/DNA_brush_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/basic.myb b/stuff/library/mypaint brushes/experimental/basic.myb new file mode 100644 index 0000000..2283362 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/basic.myb @@ -0,0 +1,191 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/basic_prev.png b/stuff/library/mypaint brushes/experimental/basic_prev.png new file mode 100644 index 0000000..d3a9cef Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/basic_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/bubble.myb b/stuff/library/mypaint brushes/experimental/bubble.myb new file mode 100644 index 0000000..0bec9ac --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/bubble.myb @@ -0,0 +1,309 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/bubble", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.185, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.228395, + -0.039844 + ], + [ + 0.391975, + -0.098281 + ], + [ + 0.574074, + -0.201875 + ], + [ + 1.0, + -0.255 + ] + ], + "random": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.075 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.04 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.64, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.126582, + -2.678125 + ], + [ + 0.370253, + -5.802604 + ], + [ + 1.0, + -8.57 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.17, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.56 + ] + ] + } + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.6, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": -1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.42284, + -0.122708 + ], + [ + 1.0, + -0.31 + ] + ], + "random": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.25 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.28 + ] + ], + "speed2": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.35 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.09, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/bubble_prev.png b/stuff/library/mypaint brushes/experimental/bubble_prev.png new file mode 100644 index 0000000..1f55415 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/bubble_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/fur.myb b/stuff/library/mypaint brushes/experimental/fur.myb new file mode 100644 index 0000000..65cf214 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/fur.myb @@ -0,0 +1,387 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.231481, + -0.022396 + ], + [ + 0.391975, + -0.082865 + ], + [ + 0.583333, + -0.201563 + ], + [ + 1.0, + -0.215 + ] + ], + "random": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.075 + ] + ], + "speed2": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.04 + ] + ] + } + }, + "color_h": { + "base_value": 0.837944664032, + "inputs": {} + }, + "color_s": { + "base_value": 0.776470588235, + "inputs": {} + }, + "color_v": { + "base_value": 0.029831387808, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 10.0 + ] + ], + "random": [ + [ + 0.0, + -10.0 + ], + [ + 1.0, + 10.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.3, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 20.67, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 56.25, + 131.25 + ], + [ + 97.3125, + -150.0 + ], + [ + 180.0, + 180.0 + ] + ], + "random": [ + [ + 0.0, + -84.0 + ], + [ + 0.2, + 84.0 + ], + [ + 0.865625, + -66.5 + ], + [ + 1.0, + 84.0 + ] + ], + "speed2": [ + [ + 0.0, + -22.775714 + ], + [ + 4.0, + 159.43 + ] + ], + "stroke": [ + [ + 0.0, + 14.29 + ], + [ + 1.0, + -14.29 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.6, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.126582, + -2.678125 + ], + [ + 0.370253, + -5.802604 + ], + [ + 1.0, + -8.57 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.56 + ] + ] + } + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.4, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 1.25, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.26, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.42284, + -0.122708 + ], + [ + 1.0, + -0.31 + ] + ], + "random": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.25 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.28 + ] + ], + "speed2": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.35 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.09, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 5.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 2.02, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/fur_prev.png b/stuff/library/mypaint brushes/experimental/fur_prev.png new file mode 100644 index 0000000..91bf05c Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/fur_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/glow.myb b/stuff/library/mypaint brushes/experimental/glow.myb new file mode 100644 index 0000000..8974018 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/glow.myb @@ -0,0 +1,241 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.5, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.16, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.43, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.025, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.19, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + -0.219479 + ], + [ + 1.0, + -0.43 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/glow_prev.png b/stuff/library/mypaint brushes/experimental/glow_prev.png new file mode 100644 index 0000000..6a71f0f Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/glow_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/hard_blot.myb b/stuff/library/mypaint brushes/experimental/hard_blot.myb new file mode 100644 index 0000000..a8ffe8e --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/hard_blot.myb @@ -0,0 +1,191 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.54, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.46, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0, + 0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 1.5, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.8, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/hard_blot_prev.png b/stuff/library/mypaint brushes/experimental/hard_blot_prev.png new file mode 100644 index 0000000..7613d83 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/hard_blot_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/hard_sting.myb b/stuff/library/mypaint brushes/experimental/hard_sting.myb new file mode 100644 index 0000000..e83912b --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/hard_sting.myb @@ -0,0 +1,263 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/hard_sting", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.95, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.62963, + 0.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ], + "stroke": [ + [ + 0.0, + -0.254583 + ], + [ + 0.058642, + -0.043333 + ], + [ + 0.231481, + 0.0 + ], + [ + 0.5, + 0.0 + ], + [ + 0.796296, + -0.037917 + ], + [ + 0.91358, + -0.47125 + ], + [ + 1.0, + -0.52 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.19, + "inputs": { + "stroke": [ + [ + 0.0, + -0.89625 + ], + [ + 0.145062, + -0.199167 + ], + [ + 0.530864, + -0.697083 + ], + [ + 0.734568, + -1.344375 + ], + [ + 0.888889, + -2.838125 + ], + [ + 1.0, + -4.78 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 2.86, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/hard_sting_prev.png b/stuff/library/mypaint brushes/experimental/hard_sting_prev.png new file mode 100644 index 0000000..bebdc16 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/hard_sting_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/irregular_ink.myb b/stuff/library/mypaint brushes/experimental/irregular_ink.myb new file mode 100644 index 0000000..aec1fdc --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/irregular_ink.myb @@ -0,0 +1,263 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/irregular_ink", + "settings": { + "anti_aliasing": { + "base_value": 2.76, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -5.3 + ], + [ + 1.0, + 5.3 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 10.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.66, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.015, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.02, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.21 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 2.69, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/irregular_ink_prev.png b/stuff/library/mypaint brushes/experimental/irregular_ink_prev.png new file mode 100644 index 0000000..249f6f6 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/irregular_ink_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/leaves.myb b/stuff/library/mypaint brushes/experimental/leaves.myb new file mode 100644 index 0000000..42809a5 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/leaves.myb @@ -0,0 +1,316 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/leaves", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.12 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.651235, + -0.007889 + ], + [ + 0.70679, + 0.115704 + ], + [ + 0.891975, + 0.101241 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.69 + ] + ] + } + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.195, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.57 + ] + ], + "random": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.355 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.080247, + -0.150625 + ], + [ + 0.614198, + 0.150625 + ], + [ + 0.753086, + 0.351458 + ], + [ + 1.0, + 0.476979 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.62963, + 0.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.89, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.598765, + -1.4175 + ], + [ + 0.709877, + 0.227813 + ], + [ + 0.898148, + -0.227813 + ], + [ + 1.0, + -2.43 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": -7.16, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 2.76, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/leaves_prev.png b/stuff/library/mypaint brushes/experimental/leaves_prev.png new file mode 100644 index 0000000..c071a57 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/leaves_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/particules_3.myb b/stuff/library/mypaint brushes/experimental/particules_3.myb new file mode 100644 index 0000000..59eb476 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/particules_3.myb @@ -0,0 +1,319 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/particules_3", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.24, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.228395, + -0.039844 + ], + [ + 0.391975, + -0.098281 + ], + [ + 0.574074, + -0.201875 + ], + [ + 1.0, + -0.255 + ] + ], + "random": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.075 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.04 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.4, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 2.39 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.72, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + -1.333333 + ], + [ + 1.0, + 2.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.17, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.56 + ] + ] + } + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.6, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.6, + "inputs": { + "pressure": [ + [ + 0.0, + 0.196979 + ], + [ + 1.0, + -0.31 + ] + ], + "random": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.25 + ] + ], + "speed1": [ + [ + 0.0, + -0.09 + ], + [ + 1.0, + 0.09 + ] + ], + "speed2": [ + [ + 0.0, + -0.09 + ], + [ + 1.0, + 0.09 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 5.95, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.05, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.06, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/particules_3_prev.png b/stuff/library/mypaint brushes/experimental/particules_3_prev.png new file mode 100644 index 0000000..cc4fa69 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/particules_3_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/particules_eraser.myb b/stuff/library/mypaint brushes/experimental/particules_eraser.myb new file mode 100644 index 0000000..cf7d1e2 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/particules_eraser.myb @@ -0,0 +1,271 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/particules_eraser", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.2 + ], + [ + 1.0, + 0.2 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -1.0 + ], + [ + 0.5, + -1.0 + ], + [ + 0.5, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.132911, + 0.510417 + ], + [ + 0.386076, + 0.802083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.3, + "inputs": { + "stroke": [ + [ + 0.0, + -1.39 + ], + [ + 0.061433, + -1.259687 + ], + [ + 0.37628, + 1.114895 + ], + [ + 0.5, + 1.39 + ], + [ + 0.610922, + 1.21625 + ], + [ + 0.90273, + -1.245208 + ], + [ + 1.0, + -1.39 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/particules_eraser_prev.png b/stuff/library/mypaint brushes/experimental/particules_eraser_prev.png new file mode 100644 index 0000000..d2572b4 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/particules_eraser_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/pick_and_drag.myb b/stuff/library/mypaint brushes/experimental/pick_and_drag.myb new file mode 100644 index 0000000..4b6fe2a --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/pick_and_drag.myb @@ -0,0 +1,285 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/pick_and_drag", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.76, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.56, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.91, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.2 + ] + ], + "stroke": [ + [ + 0.0, + -1.0 + ], + [ + 0.5, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.077381, + 0.197917 + ], + [ + 0.229167, + 0.385417 + ], + [ + 0.589286, + 0.510417 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.186667 + ], + [ + 1.0, + -0.28 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.256173, + 0.0 + ], + [ + 0.54321, + -0.114583 + ], + [ + 0.82716, + -0.447917 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + -1.0 + ], + [ + 0.104938, + -0.895833 + ], + [ + 0.274691, + 0.697917 + ], + [ + 0.580247, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 0.44, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/pick_and_drag_prev.png b/stuff/library/mypaint brushes/experimental/pick_and_drag_prev.png new file mode 100644 index 0000000..141ea9e Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/pick_and_drag_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/pixel_hardink.myb b/stuff/library/mypaint brushes/experimental/pixel_hardink.myb new file mode 100644 index 0000000..d07aa33 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/pixel_hardink.myb @@ -0,0 +1,276 @@ +{ + "comment": "MyPaint brush file", + "description": "Light, small, relatively slow hard-edged ink brush.", + "group": "", + "notes": "Designed for thumbnailing, gesture, and design.\n\nThis has mild 'not enough tapering levels' issues. Not fixable if I understand MyPaint's brush engine right, though. Expressive enough though.", + "parent_brush_name": "experimental/pixel_hardink", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.9, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 79.69, + "inputs": {} + }, + "direction_filter": { + "base_value": 10.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + -180.0 + ], + [ + 46.849315, + 180.0 + ], + [ + 90.0, + -180.0 + ], + [ + 136.232877, + 180.0 + ], + [ + 180.0, + -180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": { + "direction": [ + [ + 0.0, + -0.1 + ], + [ + 48.6, + 0.1 + ], + [ + 90.0, + -0.1 + ], + [ + 136.8, + 0.1 + ], + [ + 180.0, + -0.1 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": -0.58, + "inputs": { + "pressure": [ + [ + 0.0, + -0.53125 + ], + [ + 0.752119, + 0.5 + ], + [ + 0.980932, + 1.34375 + ], + [ + 1.0, + 1.46875 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 4.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 1.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": -8.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.2, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 3.86, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/pixel_hardink_prev.png b/stuff/library/mypaint brushes/experimental/pixel_hardink_prev.png new file mode 100644 index 0000000..5a25396 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/pixel_hardink_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/pixelblocking.myb b/stuff/library/mypaint brushes/experimental/pixelblocking.myb new file mode 100644 index 0000000..7ca544e --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/pixelblocking.myb @@ -0,0 +1,258 @@ +{ + "comment": "MyPaint brush file", + "description": "15px brush for hard edged blocking-in", + "group": "", + "notes": "Works fine in its simple function.", + "parent_brush_name": "experimental/pixelblocking", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.9, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 79.69, + "inputs": {} + }, + "direction_filter": { + "base_value": 10.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + -180.0 + ], + [ + 46.849315, + 180.0 + ], + [ + 90.0, + -180.0 + ], + [ + 136.232877, + 180.0 + ], + [ + 180.0, + -180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": { + "direction": [ + [ + 0.0, + -0.1 + ], + [ + 48.6, + 0.1 + ], + [ + 90.0, + -0.1 + ], + [ + 136.8, + 0.1 + ], + [ + 180.0, + -0.1 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 4.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 5.15, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 1.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": -8.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.2, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 3.86, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/pixelblocking_prev.png b/stuff/library/mypaint brushes/experimental/pixelblocking_prev.png new file mode 100644 index 0000000..c5436a6 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/pixelblocking_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/sewing.myb b/stuff/library/mypaint brushes/experimental/sewing.myb new file mode 100644 index 0000000..f351f3c --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/sewing.myb @@ -0,0 +1,250 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/sewing", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.62963, + 0.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.72, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.496914, + 0.734062 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 2.76, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 4.83, + "inputs": { + "random": [ + [ + 0.0, + 0.0 + ], + [ + 0.256329, + -3.313125 + ], + [ + 0.541139, + -4.7025 + ], + [ + 1.0, + -5.13 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.64 + ] + ] + } + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/sewing_prev.png b/stuff/library/mypaint brushes/experimental/sewing_prev.png new file mode 100644 index 0000000..234ab80 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/sewing_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/small_blot.myb b/stuff/library/mypaint brushes/experimental/small_blot.myb new file mode 100644 index 0000000..ed1d353 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/small_blot.myb @@ -0,0 +1,202 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.71, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.21, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.31, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.46, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0, + 0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.42, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.22, + "inputs": { + "pressure": [ + [ + 0, + 0 + ], + [ + 1.0, + -1.77 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/small_blot_prev.png b/stuff/library/mypaint brushes/experimental/small_blot_prev.png new file mode 100644 index 0000000..4f3a96c Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/small_blot_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/soft.myb b/stuff/library/mypaint brushes/experimental/soft.myb new file mode 100644 index 0000000..662c346 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/soft.myb @@ -0,0 +1,228 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.145527646522, + "inputs": {} + }, + "color_s": { + "base_value": 0.240937144227, + "inputs": {} + }, + "color_v": { + "base_value": 0.509315632868, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.14, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.63, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.69, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.175926, + 0.167917 + ], + [ + 0.354938, + 0.226042 + ], + [ + 0.546296, + 0.238958 + ], + [ + 0.753086, + 0.167917 + ], + [ + 1.0, + 0.064583 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.4, + "inputs": { + "pressure": [ + [ + 0.0, + 0.766667 + ], + [ + 1.0, + -1.15 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.99 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.3, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/soft_irregular.myb b/stuff/library/mypaint brushes/experimental/soft_irregular.myb new file mode 100644 index 0000000..8f429c4 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/soft_irregular.myb @@ -0,0 +1,253 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.246914, + 0.1 + ], + [ + 0.753086, + -0.1 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.1, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.11, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": -1.11, + "inputs": { + "pressure": [ + [ + 0.0, + 0.891354 + ], + [ + 1.0, + 1.99 + ] + ], + "speed2": [ + [ + 0.0, + -0.202857 + ], + [ + 4.0, + 1.42 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 7.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 9.02, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/soft_irregular_prev.png b/stuff/library/mypaint brushes/experimental/soft_irregular_prev.png new file mode 100644 index 0000000..9ccd170 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/soft_irregular_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/soft_prev.png b/stuff/library/mypaint brushes/experimental/soft_prev.png new file mode 100644 index 0000000..befb8a7 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/soft_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/spaced-blot.myb b/stuff/library/mypaint brushes/experimental/spaced-blot.myb new file mode 100644 index 0000000..5f534a2 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/spaced-blot.myb @@ -0,0 +1,232 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "experimental/spaced-blot", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.62963, + 0.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.89, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.54321, + -1.82 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.47, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -1.55 + ] + ] + } + }, + "stroke_holdtime": { + "base_value": 1.44, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/spaced-blot_prev.png b/stuff/library/mypaint brushes/experimental/spaced-blot_prev.png new file mode 100644 index 0000000..64a2f47 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/spaced-blot_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/speed_blot.myb b/stuff/library/mypaint brushes/experimental/speed_blot.myb new file mode 100644 index 0000000..5998c37 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/speed_blot.myb @@ -0,0 +1,202 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.71, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.21, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.31, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.42, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.22, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -1.77 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/speed_blot_prev.png b/stuff/library/mypaint brushes/experimental/speed_blot_prev.png new file mode 100644 index 0000000..420cc63 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/speed_blot_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/subtle_pencil.myb b/stuff/library/mypaint brushes/experimental/subtle_pencil.myb new file mode 100644 index 0000000..92c640e --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/subtle_pencil.myb @@ -0,0 +1,272 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 9.23, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.5, + "inputs": { + "custom": [ + [ + -2.0, + 0.0 + ], + [ + -0.703704, + 0.007292 + ], + [ + 0.469136, + 0.027083 + ], + [ + 2.0, + 0.1 + ] + ], + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.66, + "inputs": { + "custom": [ + [ + -2.0, + -3.62 + ], + [ + 2.0, + 3.62 + ] + ], + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.21 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/subtle_pencil_prev.png b/stuff/library/mypaint brushes/experimental/subtle_pencil_prev.png new file mode 100644 index 0000000..370aae3 Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/subtle_pencil_prev.png differ diff --git a/stuff/library/mypaint brushes/experimental/track.myb b/stuff/library/mypaint brushes/experimental/track.myb new file mode 100644 index 0000000..eddd8b4 --- /dev/null +++ b/stuff/library/mypaint brushes/experimental/track.myb @@ -0,0 +1,210 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.84, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.44, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.09, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.42, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": -0.43, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 0.304198, + 0.475 + ], + [ + 0.684444, + 0.940104 + ], + [ + 0.77, + 0.95 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.01, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/experimental/track_prev.png b/stuff/library/mypaint brushes/experimental/track_prev.png new file mode 100644 index 0000000..7eec85f Binary files /dev/null and b/stuff/library/mypaint brushes/experimental/track_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/Airbrush_a.myb b/stuff/library/mypaint brushes/kaerhon_v1/Airbrush_a.myb new file mode 100644 index 0000000..6c2a3e9 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/Airbrush_a.myb @@ -0,0 +1,240 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.39, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.7850717691080759, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.71, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.99, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.36, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.5, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 2.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.111111, + 0.5 + ], + [ + 0.308642, + 0.833333 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 4.7, + "inputs": { + "custom": [ + [ + -2.0, + 0.45 + ], + [ + 2.0, + -0.45 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/Airbrush_a_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/Airbrush_a_prev.png new file mode 100644 index 0000000..55d0ab1 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/Airbrush_a_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/Dirty_Transparent_sk.myb b/stuff/library/mypaint brushes/kaerhon_v1/Dirty_Transparent_sk.myb new file mode 100644 index 0000000..2b878ea --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/Dirty_Transparent_sk.myb @@ -0,0 +1,249 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "Dirty_Transparent#2", + "settings": { + "anti_aliasing": { + "base_value": 0.4, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.5, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.89, + "inputs": { + "pressure": [ + [ + 0.0, + -0.2 + ], + [ + 0.4817880794701987, + -0.002083333333333348 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.1, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.6, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.2600000000000714, + "inputs": { + "pressure": [ + [ + 0.0, + -2.38875 + ], + [ + 0.237952, + -1.8199999999999996 + ], + [ + 0.5, + -0.4550000000000002 + ], + [ + 0.76506, + 1.8199999999999998 + ], + [ + 1.0, + 2.73 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.93, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/Dirty_Transparent_sk_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/Dirty_Transparent_sk_prev.png new file mode 100644 index 0000000..5767f46 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/Dirty_Transparent_sk_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/ReadMe.txt b/stuff/library/mypaint brushes/kaerhon_v1/ReadMe.txt new file mode 100644 index 0000000..c8ff7ed --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/ReadMe.txt @@ -0,0 +1,3 @@ +Kaerhon Brush Pack V1.1 + +This brush pack is licensed under the CC0. Use it as you want. diff --git a/stuff/library/mypaint brushes/kaerhon_v1/Sketcher2_sk.myb b/stuff/library/mypaint brushes/kaerhon_v1/Sketcher2_sk.myb new file mode 100644 index 0000000..3cebd48 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/Sketcher2_sk.myb @@ -0,0 +1,321 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.6, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.08219178082191785, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 41.64, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 3.65, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.25, + 0.0 + ], + [ + 0.4133986928104575, + 0.0703125 + ], + [ + 0.5, + 0.225 + ], + [ + 0.5833333333333334, + 0.3796875 + ], + [ + 0.7026143790849673, + 0.45 + ], + [ + 1.0, + 0.45 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -1.0 + ], + [ + 0.2814569536423841, + -0.875 + ], + [ + 0.6738410596026491, + -0.46875 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.25, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.013245033112582781, + 0.5833333333333333 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + -0.27083333333333326 + ], + [ + 0.17218543046357615, + 0.125 + ], + [ + 0.4652317880794702, + 0.8229166666666666 + ], + [ + 0.75, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.3, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.066667 + ], + [ + 1.0, + -0.1 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/Sketcher2_sk_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/Sketcher2_sk_prev.png new file mode 100644 index 0000000..a61bb50 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/Sketcher2_sk_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/Smear_sm.myb b/stuff/library/mypaint brushes/kaerhon_v1/Smear_sm.myb new file mode 100644 index 0000000..845bc61 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/Smear_sm.myb @@ -0,0 +1,264 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "Smear#2", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.51, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.89, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.011589403973509934, + 0.6041666666666667 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.5, + "inputs": { + "pressure": [ + [ + 0.0, + -1.065 + ], + [ + 0.25, + -1.065 + ], + [ + 0.5, + 0.0 + ], + [ + 0.76506, + 1.42 + ], + [ + 1.0, + 2.13 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.7, + "inputs": { + "pressure": [ + [ + 0.0, + 0.8 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.8, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/Smear_sm_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/Smear_sm_prev.png new file mode 100644 index 0000000..4756d24 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/Smear_sm_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/airbruch_press_a.myb b/stuff/library/mypaint brushes/kaerhon_v1/airbruch_press_a.myb new file mode 100644 index 0000000..a59a197 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/airbruch_press_a.myb @@ -0,0 +1,250 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "airbruch_press", + "settings": { + "anti_aliasing": { + "base_value": 1.39, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.71, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.99, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.36, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.7, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 2.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.111111, + 0.5 + ], + [ + 0.308642, + 0.833333 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 4.0, + "inputs": { + "custom": [ + [ + -2.0, + 0.45 + ], + [ + 2.0, + -0.45 + ] + ], + "pressure": [ + [ + 0.0, + -1.51 + ], + [ + 1.0, + 1.4785416666666669 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/airbruch_press_a_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/airbruch_press_a_prev.png new file mode 100644 index 0000000..c549b46 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/airbruch_press_a_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/airsmudge_a.myb b/stuff/library/mypaint brushes/kaerhon_v1/airsmudge_a.myb new file mode 100644 index 0000000..5909fff --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/airsmudge_a.myb @@ -0,0 +1,265 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.39, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 1.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.71, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.99, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.36, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.175 + ], + [ + 1.0, + -0.35 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 2.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.111111, + 0.5 + ], + [ + 0.308642, + 0.833333 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 4.09, + "inputs": { + "custom": [ + [ + -2.0, + 0.45 + ], + [ + 2.0, + -0.45 + ] + ], + "pressure": [ + [ + 0.0, + -1.07 + ], + [ + 1.0, + 0.4235416666666666 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/airsmudge_a_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/airsmudge_a_prev.png new file mode 100644 index 0000000..bdfd9e8 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/airsmudge_a_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/airsmudgeultimate_sk.myb b/stuff/library/mypaint brushes/kaerhon_v1/airsmudgeultimate_sk.myb new file mode 100644 index 0000000..bbaf477 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/airsmudgeultimate_sk.myb @@ -0,0 +1,299 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + -0.01 + ], + [ + 0.5, + 0.01 + ], + [ + 1.0, + -0.01 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.08219178082191785, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.43, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.066667 + ], + [ + 1.0, + -0.030208 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.111111, + 0.5 + ], + [ + 0.308642, + 0.833333 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.5, + "inputs": { + "custom": [ + [ + -2.0, + 0.45 + ], + [ + 2.0, + -0.45 + ] + ], + "pressure": [ + [ + 0.0, + 2.47 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "custom": [ + [ + 0.0, + 0.94 + ], + [ + 0.648148, + 0.76375 + ], + [ + 0.833333, + 0.5875 + ], + [ + 0.916667, + 0.362292 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/airsmudgeultimate_sk_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/airsmudgeultimate_sk_prev.png new file mode 100644 index 0000000..1da355e Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/airsmudgeultimate_sk_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/classic_sk.myb b/stuff/library/mypaint brushes/kaerhon_v1/classic_sk.myb new file mode 100644 index 0000000..40a6419 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/classic_sk.myb @@ -0,0 +1,278 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.572632944228275, + "inputs": {} + }, + "color_s": { + "base_value": 1.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.68, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.39404, + -0.833333 + ], + [ + 0.711921, + -0.427083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.33, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.94 + ], + [ + 1.0, + 0.22520833333333334 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.066667 + ], + [ + 1.0, + -0.1 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/classic_sk_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/classic_sk_prev.png new file mode 100644 index 0000000..2027ea4 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/classic_sk_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/classicroundblock_static_c.myb b/stuff/library/mypaint brushes/kaerhon_v1/classicroundblock_static_c.myb new file mode 100644 index 0000000..3f87d60 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/classicroundblock_static_c.myb @@ -0,0 +1,267 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "classicroundblock_static#2", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 1.14, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.39404, + -0.833333 + ], + [ + 0.711921, + -0.427083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.29, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 4.099999999999999, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.066667 + ], + [ + 1.0, + -0.1 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/classicroundblock_static_c_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/classicroundblock_static_c_prev.png new file mode 100644 index 0000000..80ca14b Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/classicroundblock_static_c_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/extreme_round_l.myb b/stuff/library/mypaint brushes/kaerhon_v1/extreme_round_l.myb new file mode 100644 index 0000000..3b8d536 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/extreme_round_l.myb @@ -0,0 +1,268 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "extreme_round#2", + "settings": { + "anti_aliasing": { + "base_value": 0.4, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.51, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.89, + "inputs": { + "pressure": [ + [ + 0.0, + -0.2 + ], + [ + 0.4817880794701987, + -0.002083333333333348 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.56, + "inputs": { + "pressure": [ + [ + 0.0, + -2.38875 + ], + [ + 0.237952, + -1.8199999999999996 + ], + [ + 0.5, + -0.4550000000000002 + ], + [ + 0.76506, + 1.8199999999999998 + ], + [ + 1.0, + 2.73 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.93, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/extreme_round_l_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/extreme_round_l_prev.png new file mode 100644 index 0000000..d3122e4 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/extreme_round_l_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/fill_c.myb b/stuff/library/mypaint brushes/kaerhon_v1/fill_c.myb new file mode 100644 index 0000000..dd36501 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/fill_c.myb @@ -0,0 +1,237 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "fill#2", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 1.14, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 2.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.23, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.066667 + ], + [ + 1.0, + -0.1 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/fill_c_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/fill_c_prev.png new file mode 100644 index 0000000..25df6b6 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/fill_c_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/flat_bar_l.myb b/stuff/library/mypaint brushes/kaerhon_v1/flat_bar_l.myb new file mode 100644 index 0000000..f6a2a44 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/flat_bar_l.myb @@ -0,0 +1,279 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "flat_bar", + "settings": { + "anti_aliasing": { + "base_value": 1.1, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 1.5, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 1.5, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 5.8, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.69, + "inputs": { + "pressure": [ + [ + 0.0, + -0.2 + ], + [ + 0.4817880794701987, + -0.002083333333333348 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.05999999999999994, + "inputs": { + "pressure": [ + [ + 0.0, + -2.38875 + ], + [ + 0.20695364238410596, + -2.0759375 + ], + [ + 0.478476821192053, + 0.6825 + ], + [ + 0.75, + 2.73 + ], + [ + 1.0, + 2.73 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.93, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/flat_bar_l_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/flat_bar_l_prev.png new file mode 100644 index 0000000..e994970 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/flat_bar_l_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/ink-slowline_s.myb b/stuff/library/mypaint brushes/kaerhon_v1/ink-slowline_s.myb new file mode 100644 index 0000000..a8539eb --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/ink-slowline_s.myb @@ -0,0 +1,270 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.6, + "inputs": { + "pressure": [ + [ + 0.0, + -0.16041666666666668 + ], + [ + 1.0, + 0.32083333333333336 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.5, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.08999999999999975, + "inputs": { + "pressure": [ + [ + 0.0, + -0.6075 + ], + [ + 1.0, + 1.215 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 5.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.066667 + ], + [ + 1.0, + -0.1 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 3.0, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/ink-slowline_s_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/ink-slowline_s_prev.png new file mode 100644 index 0000000..4377bd0 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/ink-slowline_s_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/ink_slow_s.myb b/stuff/library/mypaint brushes/kaerhon_v1/ink_slow_s.myb new file mode 100644 index 0000000..c477434 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/ink_slow_s.myb @@ -0,0 +1,278 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.00784313725490196, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.59, + "inputs": { + "pressure": [ + [ + 0.0, + -0.4 + ], + [ + 0.24172185430463577, + -0.24583333333333332 + ], + [ + 0.6225165562913907, + -0.016666666666666698 + ], + [ + 1.0, + 0.32083333333333336 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.5, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.9999999999999998, + "inputs": { + "pressure": [ + [ + 0.0, + -2.52 + ], + [ + 1.0, + 1.26 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 4.83, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.066667 + ], + [ + 1.0, + -0.1 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 3.0, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/ink_slow_s_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/ink_slow_s_prev.png new file mode 100644 index 0000000..324befd Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/ink_slow_s_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/inkster_l.myb b/stuff/library/mypaint brushes/kaerhon_v1/inkster_l.myb new file mode 100644 index 0000000..9f6c7d1 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/inkster_l.myb @@ -0,0 +1,265 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "inkster#2", + "settings": { + "anti_aliasing": { + "base_value": 1.2, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.51, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.79, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.7916666666666667 + ], + [ + 0.11258278145695365, + -0.7604166666666667 + ], + [ + 0.3294701986754967, + -0.45833333333333326 + ], + [ + 0.5082781456953642, + -0.15625 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.011589403973509934, + 0.6041666666666667 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.1357615894039735, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.66, + "inputs": { + "pressure": [ + [ + 0.0, + -0.7543749999999999 + ], + [ + 0.04966887417218543, + -0.68365234375 + ], + [ + 0.1291390728476821, + -0.03929036458333327 + ], + [ + 0.32450331125827814, + 0.45576822916666665 + ], + [ + 0.6076158940397351, + 0.7072265624999999 + ], + [ + 1.0, + 0.7543749999999999 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.8, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/inkster_l_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/inkster_l_prev.png new file mode 100644 index 0000000..5ab7480 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/inkster_l_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/paint_barrr_sm.myb b/stuff/library/mypaint brushes/kaerhon_v1/paint_barrr_sm.myb new file mode 100644 index 0000000..bd179d8 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/paint_barrr_sm.myb @@ -0,0 +1,267 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "paint_barrr#2", + "settings": { + "anti_aliasing": { + "base_value": 3.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.89, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 5.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.39404, + -0.833333 + ], + [ + 0.711921, + -0.427083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.75, + "inputs": { + "pressure": [ + [ + 0.0, + 0.7 + ], + [ + 1.0, + -0.7 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/paint_barrr_sm_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/paint_barrr_sm_prev.png new file mode 100644 index 0000000..b76cc03 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/paint_barrr_sm_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/paint_radius_2_sm.myb b/stuff/library/mypaint brushes/kaerhon_v1/paint_radius_2_sm.myb new file mode 100644 index 0000000..00542f5 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/paint_radius_2_sm.myb @@ -0,0 +1,286 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "paint_radius_2#2", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.89, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.39404, + -0.833333 + ], + [ + 0.711921, + -0.427083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.4000000000000004, + "inputs": { + "pressure": [ + [ + 0.0, + 0.37239583333333326 + ], + [ + 0.3658940397350993, + 0.19466145833333326 + ], + [ + 0.6887417218543046, + -0.16080729166666663 + ], + [ + 1.0, + -0.8125 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.75, + "inputs": { + "pressure": [ + [ + 0.0, + 0.7 + ], + [ + 1.0, + -0.7 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/paint_radius_2_sm_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/paint_radius_2_sm_prev.png new file mode 100644 index 0000000..c430790 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/paint_radius_2_sm_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/paint_sm.myb b/stuff/library/mypaint brushes/kaerhon_v1/paint_sm.myb new file mode 100644 index 0000000..c54d121 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/paint_sm.myb @@ -0,0 +1,275 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "paint#2", + "settings": { + "anti_aliasing": { + "base_value": 3.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.89, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.39404, + -0.833333 + ], + [ + 0.711921, + -0.427083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.75, + "inputs": { + "pressure": [ + [ + 0.0, + 0.7 + ], + [ + 0.35927152317880795, + 0.48124999999999996 + ], + [ + 0.7019867549668874, + 0.029166666666666716 + ], + [ + 1.0, + -0.7 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.326667 + ], + [ + 0.245033, + 0.178646 + ], + [ + 1.0, + 0.49 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/paint_sm_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/paint_sm_prev.png new file mode 100644 index 0000000..b73a0ae Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/paint_sm_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/smudge_ink(0.7)_sm.myb b/stuff/library/mypaint brushes/kaerhon_v1/smudge_ink(0.7)_sm.myb new file mode 100644 index 0000000..c989fe5 --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/smudge_ink(0.7)_sm.myb @@ -0,0 +1,253 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "smudge_ink(0.7)#3", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.51, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.89, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.26, + "inputs": { + "pressure": [ + [ + 0.0, + -1.86375 + ], + [ + 0.237952, + -1.42 + ], + [ + 0.5, + -0.355 + ], + [ + 0.76506, + 1.42 + ], + [ + 1.0, + 2.13 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.69, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.93, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/smudge_ink(0.7)_sm_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/smudge_ink(0.7)_sm_prev.png new file mode 100644 index 0000000..5bd8a44 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/smudge_ink(0.7)_sm_prev.png differ diff --git a/stuff/library/mypaint brushes/kaerhon_v1/wet_paint_sm.myb b/stuff/library/mypaint brushes/kaerhon_v1/wet_paint_sm.myb new file mode 100644 index 0000000..c4fad9d --- /dev/null +++ b/stuff/library/mypaint brushes/kaerhon_v1/wet_paint_sm.myb @@ -0,0 +1,253 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "wet_paint#2", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.1006289308176101, + "inputs": {} + }, + "color_s": { + "base_value": 0.2535885167464114, + "inputs": {} + }, + "color_v": { + "base_value": 0.8196078431372549, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.51, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.89, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.011589403973509934, + 0.6041666666666667 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "pressure_gain_log": { + "base_value": 0.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.5, + "inputs": { + "pressure": [ + [ + 0.0, + -1.86375 + ], + [ + 0.237952, + -1.42 + ], + [ + 0.5, + -0.355 + ], + [ + 0.76506, + 1.42 + ], + [ + 1.0, + 2.13 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.7, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.8, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/kaerhon_v1/wet_paint_sm_prev.png b/stuff/library/mypaint brushes/kaerhon_v1/wet_paint_sm_prev.png new file mode 100644 index 0000000..ded71b9 Binary files /dev/null and b/stuff/library/mypaint brushes/kaerhon_v1/wet_paint_sm_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/100%_Opaque.myb b/stuff/library/mypaint brushes/ramon/100%_Opaque.myb new file mode 100644 index 0000000..72c9ef3 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/100%_Opaque.myb @@ -0,0 +1,199 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/100%_Opaque", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 2.18, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.95, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.025, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.01, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.65, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.18, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/100%_Opaque_prev.png b/stuff/library/mypaint brushes/ramon/100%_Opaque_prev.png new file mode 100644 index 0000000..6b4b816 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/100%_Opaque_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/2B_pencil.myb b/stuff/library/mypaint brushes/ramon/2B_pencil.myb new file mode 100644 index 0000000..28dd91f --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/2B_pencil.myb @@ -0,0 +1,229 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.374799357945, + "inputs": {} + }, + "color_s": { + "base_value": 0.00966206051583, + "inputs": {} + }, + "color_v": { + "base_value": 0.983886472877, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.12, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.22, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.141176, + -0.145833 + ], + [ + 0.255882, + -0.335417 + ], + [ + 0.332353, + -0.546875 + ], + [ + 0.361765, + -0.7 + ], + [ + 1.0, + -0.7 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.4, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.4, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/2B_pencil_prev.png b/stuff/library/mypaint brushes/ramon/2B_pencil_prev.png new file mode 100644 index 0000000..6020ae9 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/2B_pencil_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/B-pencil.myb b/stuff/library/mypaint brushes/ramon/B-pencil.myb new file mode 100644 index 0000000..daf65ac --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/B-pencil.myb @@ -0,0 +1,249 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.374799357945, + "inputs": {} + }, + "color_s": { + "base_value": 0.00966206051583, + "inputs": {} + }, + "color_v": { + "base_value": 0.983886472877, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.57, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 3.54, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.56, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.23, + "inputs": { + "pressure": [ + [ + 0.0, + 0.083333 + ], + [ + 0.126471, + 0.25 + ], + [ + 0.258824, + 0.0 + ], + [ + 0.308824, + -2.0 + ], + [ + 1.0, + -2.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.7, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.45, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.35, + "inputs": { + "pressure": [ + [ + 0.0, + -0.381902 + ], + [ + 0.36, + -0.151082 + ], + [ + 0.54, + 0.092328 + ], + [ + 0.713333, + 0.381902 + ], + [ + 1.0, + 0.402886 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.32, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.76, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.170588, + 0.234792 + ], + [ + 0.335294, + -0.173542 + ], + [ + 0.773529, + -0.255208 + ], + [ + 1.0, + -0.653333 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/B-pencil_prev.png b/stuff/library/mypaint brushes/ramon/B-pencil_prev.png new file mode 100644 index 0000000..d5ad20e Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/B-pencil_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Beamlight.myb b/stuff/library/mypaint brushes/ramon/Beamlight.myb new file mode 100644 index 0000000..598c358 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Beamlight.myb @@ -0,0 +1,241 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Beamlight", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": -0.01, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.184524, + 0.063437 + ], + [ + 0.357143, + 0.163125 + ], + [ + 0.53869, + 0.462187 + ], + [ + 0.651786, + 0.87 + ], + [ + 1.0, + 0.860938 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.35, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 6.63, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.14, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.05, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.5, + 0.479167 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.39, + "inputs": { + "pressure": [ + [ + 0.0, + 2.066667 + ], + [ + 1.0, + -3.1 + ], + [ + 1.0, + -3.1 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.6, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 0.28, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.09, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.69, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.18, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Beamlight_prev.png b/stuff/library/mypaint brushes/ramon/Beamlight_prev.png new file mode 100644 index 0000000..a78f1ab Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Beamlight_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/BigAirbrush.myb b/stuff/library/mypaint brushes/ramon/BigAirbrush.myb new file mode 100644 index 0000000..b99688f --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/BigAirbrush.myb @@ -0,0 +1,210 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/BigAirbrush", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 1.98, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.41, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.4, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.68, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.59, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.02381, + 1.924271 + ], + [ + 0.758824, + 0.0 + ], + [ + 1.0, + -1.483292 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 0.14, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.31, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/BigAirbrush_prev.png b/stuff/library/mypaint brushes/ramon/BigAirbrush_prev.png new file mode 100644 index 0000000..8ee9146 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/BigAirbrush_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Blur_Fast.myb b/stuff/library/mypaint brushes/ramon/Blur_Fast.myb new file mode 100644 index 0000000..bc84f82 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Blur_Fast.myb @@ -0,0 +1,202 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Blur_Fast", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.53, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.4 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.15, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.5, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Blur_Fast_prev.png b/stuff/library/mypaint brushes/ramon/Blur_Fast_prev.png new file mode 100644 index 0000000..34a33a0 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Blur_Fast_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Classic_Paint.myb b/stuff/library/mypaint brushes/ramon/Classic_Paint.myb new file mode 100644 index 0000000..18f2974 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Classic_Paint.myb @@ -0,0 +1,273 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Classic_Paint", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 2.09, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.1, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.47, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 5.19, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.95, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.223214, + 0.28125 + ], + [ + 0.425595, + 0.677083 + ], + [ + 0.720238, + 0.9375 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.6, + "inputs": { + "custom": [ + [ + -2.0, + 1.38 + ], + [ + 2.0, + -1.38 + ] + ], + "pressure": [ + [ + 0.0, + -1.484375 + ], + [ + 0.408824, + 0.0 + ], + [ + 0.726471, + 0.59375 + ], + [ + 1.0, + 1.5 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.666667 + ], + [ + 0.25, + 0.052083 + ], + [ + 0.464286, + -0.333333 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.02, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Classic_Paint_prev.png b/stuff/library/mypaint brushes/ramon/Classic_Paint_prev.png new file mode 100644 index 0000000..8db33ce Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Classic_Paint_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Clouds.myb b/stuff/library/mypaint brushes/ramon/Clouds.myb new file mode 100644 index 0000000..4f80061 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Clouds.myb @@ -0,0 +1,273 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Clouds", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.17, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.17, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 1.42, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.23, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015823, + 2.050417 + ], + [ + 0.265823, + 2.050417 + ], + [ + 0.471519, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ], + "speed2": [ + [ + 0.0, + 0.0 + ], + [ + 0.28481, + -1.246667 + ], + [ + 1.0, + 1.36 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.51, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.57, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 0.817901, + 1.659167 + ], + [ + 0.910494, + 1.81 + ], + [ + 1.0, + 1.81 + ] + ], + "speed2": [ + [ + 0.0, + 0.0 + ], + [ + 0.074074, + -0.255208 + ], + [ + 0.490741, + 0.0 + ], + [ + 0.611111, + 0.583333 + ], + [ + 0.867284, + 0.7 + ], + [ + 1.0, + 0.7 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 0.14, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.31, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Clouds_prev.png b/stuff/library/mypaint brushes/ramon/Clouds_prev.png new file mode 100644 index 0000000..b481ce7 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Clouds_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Delayed_.myb b/stuff/library/mypaint brushes/ramon/Delayed_.myb new file mode 100644 index 0000000..ef5edd5 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Delayed_.myb @@ -0,0 +1,249 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Delayed_", + "settings": { + "anti_aliasing": { + "base_value": 0.7, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.82, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.51, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 70.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -2.13 + ], + [ + 0.237952, + -1.42 + ], + [ + 0.341176, + -1.065 + ], + [ + 0.5, + -0.355 + ], + [ + 0.76506, + 1.42 + ], + [ + 1.0, + 2.13 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 10.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 8.2, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Delayed__prev.png b/stuff/library/mypaint brushes/ramon/Delayed__prev.png new file mode 100644 index 0000000..f75c3f6 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Delayed__prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Dirty_Noise.myb b/stuff/library/mypaint brushes/ramon/Dirty_Noise.myb new file mode 100644 index 0000000..d27ba17 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Dirty_Noise.myb @@ -0,0 +1,299 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Dirty_Noise", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": { + "random": [ + [ + 0.0, + -3.81 + ], + [ + 1.0, + 3.81 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.214706, + 0.0 + ], + [ + 0.808824, + 1.6875 + ], + [ + 1.0, + 2.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.62963, + 0.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.029412, + 0.9375 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.19, + "inputs": { + "pressure": [ + [ + 0.0, + 0.916667 + ], + [ + 0.255882, + 0.0 + ], + [ + 0.5, + 0.0 + ], + [ + 0.747059, + -1.595 + ], + [ + 1.0, + -1.76 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.54321, + -1.82 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.47, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -1.55 + ] + ] + } + }, + "stroke_holdtime": { + "base_value": 1.44, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 2.09, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Dirty_Noise_prev.png b/stuff/library/mypaint brushes/ramon/Dirty_Noise_prev.png new file mode 100644 index 0000000..7bc0a2e Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Dirty_Noise_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Glow_Airbrush.myb b/stuff/library/mypaint brushes/ramon/Glow_Airbrush.myb new file mode 100644 index 0000000..9e8bbff --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Glow_Airbrush.myb @@ -0,0 +1,263 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Glow_Airbrush", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.070313 + ], + [ + 0.552941, + 0.031875 + ], + [ + 1.0, + 0.09 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.62 + ] + ] + } + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": -0.01, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.447059, + 0.147292 + ], + [ + 0.588235, + 0.347187 + ], + [ + 0.735294, + 0.599688 + ], + [ + 0.844118, + 1.01 + ], + [ + 1.0, + 0.99948 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.35, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 6.63, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.14, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.308641975309, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.05, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.5, + 0.479167 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 4.75, + "inputs": { + "pressure": [ + [ + 0.0, + 0.586667 + ], + [ + 1.0, + -0.88 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.6, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 0.28, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.09, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.69, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.18, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Glow_Airbrush_prev.png b/stuff/library/mypaint brushes/ramon/Glow_Airbrush_prev.png new file mode 100644 index 0000000..2ab7392 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Glow_Airbrush_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Grain.myb b/stuff/library/mypaint brushes/ramon/Grain.myb new file mode 100644 index 0000000..650eb09 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Grain.myb @@ -0,0 +1,232 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Grain", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "random": [ + [ + 0.0, + -1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.1, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.648, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.064815, + 0.666667 + ], + [ + 0.135802, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.3, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Grain_prev.png b/stuff/library/mypaint brushes/ramon/Grain_prev.png new file mode 100644 index 0000000..1a5e999 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Grain_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Hard_Eraser.myb b/stuff/library/mypaint brushes/ramon/Hard_Eraser.myb new file mode 100644 index 0000000..1c35b98 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Hard_Eraser.myb @@ -0,0 +1,243 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Hard_Eraser", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 1.37, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 2.44, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 1.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.025, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.5, + "inputs": { + "pressure": [ + [ + 0.0, + -2.325 + ], + [ + 0.452941, + 0.1 + ], + [ + 0.641176, + 0.325 + ], + [ + 0.820588, + 0.85 + ], + [ + 1.0, + 2.4 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 3.66, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Hard_Eraser_prev.png b/stuff/library/mypaint brushes/ramon/Hard_Eraser_prev.png new file mode 100644 index 0000000..2134b1e Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Hard_Eraser_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Knife.myb b/stuff/library/mypaint brushes/ramon/Knife.myb new file mode 100644 index 0000000..6c16579 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Knife.myb @@ -0,0 +1,232 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Knife", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.71, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.95, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.99, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 6.52, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.117284, + 0.635417 + ], + [ + 0.330247, + 0.9375 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.11, + "inputs": { + "pressure": [ + [ + 0.0, + -1.6 + ], + [ + 1.0, + 2.4 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Knife_prev.png b/stuff/library/mypaint brushes/ramon/Knife_prev.png new file mode 100644 index 0000000..c9bf0e3 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Knife_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Marker.myb b/stuff/library/mypaint brushes/ramon/Marker.myb new file mode 100644 index 0000000..98dbc69 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Marker.myb @@ -0,0 +1,313 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.874938453964, + "inputs": {} + }, + "color_s": { + "base_value": 0.990248659191, + "inputs": {} + }, + "color_v": { + "base_value": 0.0312962539101, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 5.46, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.09 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.74, + "inputs": { + "pressure": [ + [ + 0.0, + -0.5 + ], + [ + 0.213855, + -0.458333 + ], + [ + 0.343373, + -0.307291 + ], + [ + 0.448795, + 0.020833 + ], + [ + 0.533133, + 0.421875 + ], + [ + 0.728916, + 0.5 + ], + [ + 0.873494, + 0.5 + ], + [ + 1.0, + 0.5 + ] + ], + "speed1": [ + [ + 0.0, + 0.947917 + ], + [ + 0.614458, + 0.34375 + ], + [ + 1.53012, + -0.135417 + ], + [ + 2.481928, + -0.489583 + ], + [ + 3.325301, + -0.885417 + ], + [ + 4.0, + -1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.015, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.32, + "inputs": { + "pressure": [ + [ + 0.0, + -0.398646 + ], + [ + 1.0, + 0.43 + ] + ], + "speed1": [ + [ + 0.0, + 0.118646 + ], + [ + 1.0, + -0.17 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.8, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Marker_prev.png b/stuff/library/mypaint brushes/ramon/Marker_prev.png new file mode 100644 index 0000000..804051f Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Marker_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/P._Shade.myb b/stuff/library/mypaint brushes/ramon/P._Shade.myb new file mode 100644 index 0000000..3b169a8 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/P._Shade.myb @@ -0,0 +1,233 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.874938453964, + "inputs": {} + }, + "color_s": { + "base_value": 0.990248659191, + "inputs": {} + }, + "color_v": { + "base_value": 0.0312962539101, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.69, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.93, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 5.07, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -2.0 + ] + ], + "speed1": [ + [ + 0.0, + -0.25 + ], + [ + 4.0, + 1.75 + ] + ], + "speed2": [ + [ + 0.0, + -0.25 + ], + [ + 4.0, + 1.75 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.123456790123, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.28, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.06, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/P._Shade_prev.png b/stuff/library/mypaint brushes/ramon/P._Shade_prev.png new file mode 100644 index 0000000..baa2b19 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/P._Shade_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Pastel_1.myb b/stuff/library/mypaint brushes/ramon/Pastel_1.myb new file mode 100644 index 0000000..63e9ad5 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Pastel_1.myb @@ -0,0 +1,261 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Pastel_1", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.4980392156862745, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.57, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 3.54, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.48, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + -0.666667 + ], + [ + 0.426471, + 0.052083 + ], + [ + 0.755882, + 0.072917 + ], + [ + 0.844118, + 0.947917 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.435294, + -0.041667 + ], + [ + 0.753425, + -0.6875 + ], + [ + 1.0, + 0.0 + ] + ], + "speed1": [ + [ + 0.0, + -0.285714 + ], + [ + 4.0, + 2.0 + ] + ], + "speed2": [ + [ + 0.0, + -0.285714 + ], + [ + 4.0, + 2.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.45, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.48, + "inputs": { + "pressure": [ + [ + 0.0, + -0.3125 + ], + [ + 0.0701219512195122, + -0.10416666666666674 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 1.08, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.71, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "snap_to_pixel": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Pastel_1_prev.png b/stuff/library/mypaint brushes/ramon/Pastel_1_prev.png new file mode 100644 index 0000000..d489cd9 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Pastel_1_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Pen.myb b/stuff/library/mypaint brushes/ramon/Pen.myb new file mode 100644 index 0000000..74de6b0 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Pen.myb @@ -0,0 +1,214 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.845694888549, + "inputs": {} + }, + "color_s": { + "base_value": 0.818968461801, + "inputs": {} + }, + "color_v": { + "base_value": 0.268039978637, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 2.18, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 15.82, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.6, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.85, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.111765, + 0.958333 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.14, + "inputs": { + "speed1": [ + [ + 0.0, + 0.117142 + ], + [ + 1.564706, + -0.264792 + ], + [ + 4.0, + -0.82 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.18, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/PenBrush.myb b/stuff/library/mypaint brushes/ramon/PenBrush.myb new file mode 100644 index 0000000..2f54ef4 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/PenBrush.myb @@ -0,0 +1,245 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/PenBrush", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.51, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.89, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.989583 + ], + [ + 0.38253, + -0.59375 + ], + [ + 0.656627, + 0.041667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.069277, + 0.9375 + ], + [ + 0.25, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.26, + "inputs": { + "pressure": [ + [ + 0.0, + -1.86375 + ], + [ + 0.237952, + -1.42 + ], + [ + 0.5, + -0.355 + ], + [ + 0.76506, + 1.42 + ], + [ + 1.0, + 2.13 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 4.55, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.87, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/PenBrush_prev.png b/stuff/library/mypaint brushes/ramon/PenBrush_prev.png new file mode 100644 index 0000000..61e9f39 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/PenBrush_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Pen_prev.png b/stuff/library/mypaint brushes/ramon/Pen_prev.png new file mode 100644 index 0000000..8d92608 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Pen_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/RS_blendOP.myb b/stuff/library/mypaint brushes/ramon/RS_blendOP.myb new file mode 100644 index 0000000..a895ba8 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/RS_blendOP.myb @@ -0,0 +1,289 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/RS_blendOP", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 2.09, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.29, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.44, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -6.0 + ], + [ + 0.411765, + 0.5625 + ], + [ + 0.467647, + 7.3125 + ], + [ + 1.0, + 9.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.93, + "inputs": { + "pressure": [ + [ + 0.0, + -0.666667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.324405, + 0.322917 + ], + [ + 0.52381, + 0.635417 + ], + [ + 0.776786, + 0.885417 + ], + [ + 1.0, + 0.927083 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.82, + "inputs": { + "pressure": [ + [ + 0.0, + 0.049375 + ], + [ + 1.0, + -0.79 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.142857, + 1.0 + ], + [ + 0.345238, + 1.0 + ], + [ + 0.422619, + 0.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.85, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/RS_blendOP_prev.png b/stuff/library/mypaint brushes/ramon/RS_blendOP_prev.png new file mode 100644 index 0000000..e25ab51 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/RS_blendOP_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Round.myb b/stuff/library/mypaint brushes/ramon/Round.myb new file mode 100644 index 0000000..6cbff10 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Round.myb @@ -0,0 +1,260 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Round", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.02, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "speed2": [ + [ + 0.0, + 0.28 + ], + [ + 0.518519, + 0.032083 + ], + [ + 1.888889, + -0.16625 + ], + [ + 4.0, + -0.28 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.52 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.3, + "inputs": { + "pressure": [ + [ + 0.0, + 0.326667 + ], + [ + 1.0, + -0.49 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.75 + ] + ], + "speed2": [ + [ + 0.0, + -0.15 + ], + [ + 4.0, + 1.05 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.290123, + -0.0375 + ], + [ + 0.645062, + -0.15 + ], + [ + 1.0, + -0.4 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 1.24, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.1, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.61, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Round_Bl.myb b/stuff/library/mypaint brushes/ramon/Round_Bl.myb new file mode 100644 index 0000000..8b17f66 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Round_Bl.myb @@ -0,0 +1,292 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Round_Bl", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + -0.01 + ], + [ + 0.5, + 0.01 + ], + [ + 1.0, + -0.01 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.71, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.75, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.58, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.85, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.405882, + 0.15625 + ], + [ + 0.5, + 0.572917 + ], + [ + 0.664706, + 0.8125 + ], + [ + 0.844118, + 0.947917 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.01, + "inputs": { + "custom": [ + [ + -2.0, + 0.45 + ], + [ + 2.0, + -0.45 + ] + ], + "pressure": [ + [ + 0.0, + -0.466667 + ], + [ + 1.0, + 0.7 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.51, + "inputs": { + "custom": [ + [ + 0.0, + 0.949375 + ], + [ + 0.414706, + 0.42875 + ], + [ + 0.620588, + 0.142917 + ], + [ + 0.708824, + -0.18375 + ], + [ + 0.8, + -0.98 + ], + [ + 1.0, + -0.98 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Round_Bl_prev.png b/stuff/library/mypaint brushes/ramon/Round_Bl_prev.png new file mode 100644 index 0000000..656f5c7 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Round_Bl_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Round_prev.png b/stuff/library/mypaint brushes/ramon/Round_prev.png new file mode 100644 index 0000000..b5ba663 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Round_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Sketch_1.myb b/stuff/library/mypaint brushes/ramon/Sketch_1.myb new file mode 100644 index 0000000..3c263a6 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Sketch_1.myb @@ -0,0 +1,218 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Sketch_1", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 3.57, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 3.54, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + 2.0 + ], + [ + 0.160714, + 1.583333 + ], + [ + 0.28869, + 0.708333 + ], + [ + 0.440476, + -2.0 + ], + [ + 1.0, + -2.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.45, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.34, + "inputs": { + "pressure": [ + [ + 0.0, + -0.666667 + ], + [ + 0.404762, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.88, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.39, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Sketch_1_prev.png b/stuff/library/mypaint brushes/ramon/Sketch_1_prev.png new file mode 100644 index 0000000..55ee798 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Sketch_1_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Smear.myb b/stuff/library/mypaint brushes/ramon/Smear.myb new file mode 100644 index 0000000..e636403 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Smear.myb @@ -0,0 +1,232 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Smear", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + -0.697917 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.4, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.35, + "inputs": { + "pressure": [ + [ + 0.0, + -0.66 + ], + [ + 0.417647, + 0.0 + ], + [ + 0.782353, + 0.391875 + ], + [ + 1.0, + 0.99 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Smear_prev.png b/stuff/library/mypaint brushes/ramon/Smear_prev.png new file mode 100644 index 0000000..57b1e1e Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Smear_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Soft_Eraser.myb b/stuff/library/mypaint brushes/ramon/Soft_Eraser.myb new file mode 100644 index 0000000..524075b --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Soft_Eraser.myb @@ -0,0 +1,206 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.00358587014572, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 1.22, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 1.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.5, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.06, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.56, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.11 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + 1.24375 + ], + [ + 0.405882, + 1.181563 + ], + [ + 1.0, + 1.99 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Soft_Eraser_prev.png b/stuff/library/mypaint brushes/ramon/Soft_Eraser_prev.png new file mode 100644 index 0000000..b15ecba Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Soft_Eraser_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Thin_Pen.myb b/stuff/library/mypaint brushes/ramon/Thin_Pen.myb new file mode 100644 index 0000000..79ac72a --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Thin_Pen.myb @@ -0,0 +1,249 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.845694888549, + "inputs": {} + }, + "color_s": { + "base_value": 0.818968461801, + "inputs": {} + }, + "color_v": { + "base_value": 0.268039978637, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.2, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 2.18, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 3.75, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.43, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "speed1": [ + [ + 0.0, + 0.48 + ], + [ + 1.023529, + 0.35 + ], + [ + 1.788235, + 0.18 + ], + [ + 2.635294, + -0.115 + ], + [ + 3.564706, + -0.36 + ], + [ + 4.0, + -0.48 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.85, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.015, + 0.0 + ], + [ + 0.111765, + 0.958333 + ], + [ + 0.435294, + 0.864583 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.08, + "inputs": { + "speed1": [ + [ + 0.0, + -0.248354 + ], + [ + 1.068493, + -0.482911 + ], + [ + 2.287671, + -1.076202 + ], + [ + 4.0, + -1.09 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 2.67, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.05, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 1.18, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Thin_Pen_prev.png b/stuff/library/mypaint brushes/ramon/Thin_Pen_prev.png new file mode 100644 index 0000000..f1f5bca Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Thin_Pen_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/Wet_Direction.myb b/stuff/library/mypaint brushes/ramon/Wet_Direction.myb new file mode 100644 index 0000000..e500a03 --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/Wet_Direction.myb @@ -0,0 +1,224 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/Wet_Direction", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.99, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 3.72, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.5, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.37, + "inputs": { + "custom": [ + [ + -2.0, + -3.66 + ], + [ + 2.0, + 3.66 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.51, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.26, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/Wet_Direction_prev.png b/stuff/library/mypaint brushes/ramon/Wet_Direction_prev.png new file mode 100644 index 0000000..45955c4 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/Wet_Direction_prev.png differ diff --git a/stuff/library/mypaint brushes/ramon/wet_round.myb b/stuff/library/mypaint brushes/ramon/wet_round.myb new file mode 100644 index 0000000..924424b --- /dev/null +++ b/stuff/library/mypaint brushes/ramon/wet_round.myb @@ -0,0 +1,244 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "ramon/wet_round", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.05, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 0.35, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.95, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.666667 + ], + [ + 0.313253, + -0.166667 + ], + [ + 0.575301, + 0.229167 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.222222, + 0.0 + ], + [ + 0.454819, + 0.538125 + ], + [ + 1.0, + 0.63 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.07, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 1.0 + ], + [ + 0.401786, + 0.96875 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.12, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/ramon/wet_round_prev.png b/stuff/library/mypaint brushes/ramon/wet_round_prev.png new file mode 100644 index 0000000..b08d722 Binary files /dev/null and b/stuff/library/mypaint brushes/ramon/wet_round_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-03-only-water.myb b/stuff/library/mypaint brushes/tanda/acrylic-03-only-water.myb new file mode 100644 index 0000000..94c2398 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-03-only-water.myb @@ -0,0 +1,298 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/acrylic-03-only-water", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.737654, + -0.0 + ], + [ + 1.0, + -9.0 + ] + ], + "speed1": [ + [ + 0.0, + -7.0 + ], + [ + 4.0, + 7.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.740741, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ] + } + }, + "hardness": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.401235, + -0.0 + ], + [ + 1.0, + -0.45 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.746914, + 0.0 + ], + [ + 1.0, + 0.45 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.9, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 1.1 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 5.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 2.8, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-03-only-water_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-03-only-water_prev.png new file mode 100644 index 0000000..7e2df05 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-03-only-water_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-03-paint.myb b/stuff/library/mypaint brushes/tanda/acrylic-03-paint.myb new file mode 100644 index 0000000..e36fa0d --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-03-paint.myb @@ -0,0 +1,279 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/acrylic-03-paint", + "settings": { + "anti_aliasing": { + "base_value": 0.63, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + -0.01 + ], + [ + 1.0, + 0.01 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "speed1": [ + [ + 0.0, + -8.5 + ], + [ + 4.0, + 8.5 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.049383, + 0.572917 + ], + [ + 0.151235, + 0.916667 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.7, + "inputs": { + "pressure": [ + [ + 0.0, + -2.5 + ], + [ + 1.0, + 0.3125 + ] + ], + "stroke": [ + [ + 0.0, + -0.0 + ], + [ + 0.669753, + -0.0 + ], + [ + 1.0, + -2.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 7.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-03-paint_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-03-paint_prev.png new file mode 100644 index 0000000..f11629b Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-03-paint_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-03-with-water.myb b/stuff/library/mypaint brushes/tanda/acrylic-03-with-water.myb new file mode 100644 index 0000000..72de643 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-03-with-water.myb @@ -0,0 +1,243 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/acrylic-03-with-water", + "settings": { + "anti_aliasing": { + "base_value": 0.44, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "speed1": [ + [ + 0.0, + -7.5 + ], + [ + 0.962963, + -2.03125 + ], + [ + 4.0, + 0.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.95, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.058642, + 0.604167 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.9, + "inputs": { + "pressure": [ + [ + 0.0, + -2.6 + ], + [ + 1.0, + 0.433333 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.9, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-03-with-water_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-03-with-water_prev.png new file mode 100644 index 0000000..14d1232 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-03-with-water_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-04-only-water.myb b/stuff/library/mypaint brushes/tanda/acrylic-04-only-water.myb new file mode 100644 index 0000000..15d8c3d --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-04-only-water.myb @@ -0,0 +1,306 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/acrylic-04-only-water", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 1.0, + -2.7 + ] + ], + "speed1": [ + [ + 0.0, + -2.5 + ], + [ + 4.0, + 2.5 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.753086, + 0.0 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "hardness": { + "base_value": 0.4, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.746914, + -0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 0.8 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "random": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.040123, + 0.885417 + ], + [ + 0.138889, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.9, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-04-only-water_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-04-only-water_prev.png new file mode 100644 index 0000000..2895b0d Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-04-only-water_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-04-paint.myb b/stuff/library/mypaint brushes/tanda/acrylic-04-paint.myb new file mode 100644 index 0000000..58152d0 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-04-paint.myb @@ -0,0 +1,254 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + -0.01 + ], + [ + 1.0, + 0.01 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": { + "speed1": [ + [ + 0.0, + -4.0 + ], + [ + 4.0, + 4.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "random": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.040123, + 0.885417 + ], + [ + 0.138889, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.6, + "inputs": { + "pressure": [ + [ + 0.0, + -2.6 + ], + [ + 1.0, + 0.677083 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-04-paint_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-04-paint_prev.png new file mode 100644 index 0000000..0f53b2f Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-04-paint_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-04-with-water.myb b/stuff/library/mypaint brushes/tanda/acrylic-04-with-water.myb new file mode 100644 index 0000000..9b501c5 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-04-with-water.myb @@ -0,0 +1,262 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/acrylic-04-with-water", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": { + "speed1": [ + [ + 0.0, + -4.0 + ], + [ + 4.0, + 4.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.5, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "random": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.040123, + 0.885417 + ], + [ + 0.138889, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.6, + "inputs": { + "pressure": [ + [ + 0.0, + -2.6 + ], + [ + 1.0, + 0.65 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.398148, + -0.0 + ], + [ + 0.743827, + -0.4 + ], + [ + 1.0, + -0.4 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-04-with-water_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-04-with-water_prev.png new file mode 100644 index 0000000..aad96b7 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-04-with-water_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-05-only-water.myb b/stuff/library/mypaint brushes/tanda/acrylic-05-only-water.myb new file mode 100644 index 0000000..cbea5d0 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-05-only-water.myb @@ -0,0 +1,231 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/acrylic-05-only-water", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.18, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.9, + "inputs": { + "speed1": [ + [ + 0.0, + 0.028571 + ], + [ + 4.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.046296, + 0.71875 + ], + [ + 0.154321, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.1, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.958333 + ], + [ + 1.0, + 2.0 + ] + ], + "speed1": [ + [ + 0.0, + -0.916667 + ], + [ + 3.7, + -2.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.9, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-05-only-water_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-05-only-water_prev.png new file mode 100644 index 0000000..9c4f9aa Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-05-only-water_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-05-paint.myb b/stuff/library/mypaint brushes/tanda/acrylic-05-paint.myb new file mode 100644 index 0000000..3df38af --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-05-paint.myb @@ -0,0 +1,231 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/acrylic-05-paint", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.9, + "inputs": { + "speed1": [ + [ + 0.0, + 0.028571 + ], + [ + 4.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.046296, + 0.71875 + ], + [ + 0.154321, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.1, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.958333 + ], + [ + 1.0, + 2.0 + ] + ], + "speed1": [ + [ + 0.0, + -0.916667 + ], + [ + 3.7, + -2.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-05-paint_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-05-paint_prev.png new file mode 100644 index 0000000..1004ff8 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-05-paint_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/acrylic-05-with-water.myb b/stuff/library/mypaint brushes/tanda/acrylic-05-with-water.myb new file mode 100644 index 0000000..daa14f3 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/acrylic-05-with-water.myb @@ -0,0 +1,234 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/acrylic-05-with-water", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.9, + "inputs": { + "speed1": [ + [ + 0.0, + 0.11 + ], + [ + 4.0, + -0.77 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.1, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.083333 + ], + [ + 1.0, + 2.0 + ] + ], + "speed1": [ + [ + 0.0, + -1.00375 + ], + [ + 3.7, + -2.19 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.1, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/acrylic-05-with-water_prev.png b/stuff/library/mypaint brushes/tanda/acrylic-05-with-water_prev.png new file mode 100644 index 0000000..6082a1b Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/acrylic-05-with-water_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/charcoal-01.myb b/stuff/library/mypaint brushes/tanda/charcoal-01.myb new file mode 100644 index 0000000..efda262 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/charcoal-01.myb @@ -0,0 +1,260 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/charcoal-01", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 3.0, + "inputs": { + "random": [ + [ + 0.0, + -1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.9, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ], + "random": [ + [ + 0.0, + -0.6 + ], + [ + 1.0, + 0.6 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.083333, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": -0.4, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.6 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 4.0, + 0.2 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/charcoal-01_prev.png b/stuff/library/mypaint brushes/tanda/charcoal-01_prev.png new file mode 100644 index 0000000..a00f558 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/charcoal-01_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/charcoal-03.myb b/stuff/library/mypaint brushes/tanda/charcoal-03.myb new file mode 100644 index 0000000..a3450e9 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/charcoal-03.myb @@ -0,0 +1,258 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 3.0, + "inputs": { + "random": [ + [ + 0.0, + -1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + -0.101563 + ], + [ + 0.243827, + -0.101563 + ], + [ + 0.5, + 0.75 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.083333, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 4.0, + 0.3 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/charcoal-03_prev.png b/stuff/library/mypaint brushes/tanda/charcoal-03_prev.png new file mode 100644 index 0000000..2e13ee0 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/charcoal-03_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/charcoal-04.myb b/stuff/library/mypaint brushes/tanda/charcoal-04.myb new file mode 100644 index 0000000..9541a17 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/charcoal-04.myb @@ -0,0 +1,247 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "random": [ + [ + 0.0, + 9.0 + ], + [ + 1.0, + -9.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.064815, + 0.666667 + ], + [ + 0.135802, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.1, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 3.024691, + 0.0 + ], + [ + 4.0, + 0.5 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/charcoal-04_prev.png b/stuff/library/mypaint brushes/tanda/charcoal-04_prev.png new file mode 100644 index 0000000..8747a6a Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/charcoal-04_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/charcoal-blur1.myb b/stuff/library/mypaint brushes/tanda/charcoal-blur1.myb new file mode 100644 index 0000000..74b7e48 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/charcoal-blur1.myb @@ -0,0 +1,232 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "random": [ + [ + 0.0, + -1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.1, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.75 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.064815, + 0.666667 + ], + [ + 0.135802, + 0.927083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.6, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/charcoal-blur1_prev.png b/stuff/library/mypaint brushes/tanda/charcoal-blur1_prev.png new file mode 100644 index 0000000..b8c8b3d Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/charcoal-blur1_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/marker-01.myb b/stuff/library/mypaint brushes/tanda/marker-01.myb new file mode 100644 index 0000000..e697bca --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/marker-01.myb @@ -0,0 +1,227 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/marker-01", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 1.68, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.6, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.11, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.4, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.074405, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.35, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.15 + ] + ], + "speed2": [ + [ + 0.0, + -0.0 + ], + [ + 4.0, + -0.04 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/marker-01_prev.png b/stuff/library/mypaint brushes/tanda/marker-01_prev.png new file mode 100644 index 0000000..e2abd32 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/marker-01_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/marker-05.myb b/stuff/library/mypaint brushes/tanda/marker-05.myb new file mode 100644 index 0000000..f04f675 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/marker-05.myb @@ -0,0 +1,234 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/marker-05", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 1.68, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.6, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.354167 + ], + [ + 1.0, + -0.0 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.2, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.35, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.7 + ] + ], + "speed2": [ + [ + 0.0, + -0.0 + ], + [ + 4.0, + -0.04 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/marker-05_prev.png b/stuff/library/mypaint brushes/tanda/marker-05_prev.png new file mode 100644 index 0000000..969ae88 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/marker-05_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/oil-01-clean.myb b/stuff/library/mypaint brushes/tanda/oil-01-clean.myb new file mode 100644 index 0000000..f046a3a --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/oil-01-clean.myb @@ -0,0 +1,277 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/oil-01-clean", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 7.1, + "inputs": { + "stroke": [ + [ + 0.0, + -0.4 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.6, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + -2.0 + ], + [ + 0.398148, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.5, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/oil-01-clean_prev.png b/stuff/library/mypaint brushes/tanda/oil-01-clean_prev.png new file mode 100644 index 0000000..c930617 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/oil-01-clean_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/oil-01-paint.myb b/stuff/library/mypaint brushes/tanda/oil-01-paint.myb new file mode 100644 index 0000000..20f2c49 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/oil-01-paint.myb @@ -0,0 +1,302 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/oil-01-paint", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.969136, + 0.01 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 7.1, + "inputs": { + "stroke": [ + [ + 0.0, + -0.4 + ], + [ + 1.0, + 0.4 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.6, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "pressure": [ + [ + 0.0, + -2.3 + ], + [ + 0.398148, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.4, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.6 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.5, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/oil-01-paint_prev.png b/stuff/library/mypaint brushes/tanda/oil-01-paint_prev.png new file mode 100644 index 0000000..c5c94e5 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/oil-01-paint_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/oil-03-clean.myb b/stuff/library/mypaint brushes/tanda/oil-03-clean.myb new file mode 100644 index 0000000..3d75f68 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/oil-03-clean.myb @@ -0,0 +1,287 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/oil-03-clean", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.01 + ], + [ + 1.0, + 0.01 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.92284, + 0.01 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ], + "random": [ + [ + 0.0, + -0.5 + ], + [ + 1.0, + 0.5 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 7.1, + "inputs": { + "stroke": [ + [ + 0.0, + -0.5 + ], + [ + 1.0, + 0.5 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.4, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.3, + "inputs": { + "pressure": [ + [ + 0.0, + -2.3 + ], + [ + 0.401235, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/oil-03-clean_prev.png b/stuff/library/mypaint brushes/tanda/oil-03-clean_prev.png new file mode 100644 index 0000000..f84d6d5 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/oil-03-clean_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/oil-03-paint.myb b/stuff/library/mypaint brushes/tanda/oil-03-paint.myb new file mode 100644 index 0000000..eb0bf4a --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/oil-03-paint.myb @@ -0,0 +1,319 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/oil-03-paint", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.01 + ], + [ + 1.0, + 0.01 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.92284, + 0.01 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 180.0 + ] + ], + "random": [ + [ + 0.0, + -0.5 + ], + [ + 1.0, + 0.5 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 7.1, + "inputs": { + "stroke": [ + [ + 0.0, + -0.5 + ], + [ + 1.0, + 0.5 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.4, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.166667, + 0.75 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.067901, + 0.78125 + ], + [ + 0.185185, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.3, + "inputs": { + "pressure": [ + [ + 0.0, + -2.3 + ], + [ + 0.401235, + 0.0 + ], + [ + 1.0, + 0.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -1.0 + ] + ], + "stroke": [ + [ + 0.0, + -1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": { + "stroke": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + -1.0 + ] + ] + } + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.2, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/oil-03-paint_prev.png b/stuff/library/mypaint brushes/tanda/oil-03-paint_prev.png new file mode 100644 index 0000000..04ff7f9 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/oil-03-paint_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/oil-06-clean.myb b/stuff/library/mypaint brushes/tanda/oil-06-clean.myb new file mode 100644 index 0000000..d74f74a --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/oil-06-clean.myb @@ -0,0 +1,231 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/oil-06-clean", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.9, + "inputs": { + "speed1": [ + [ + 0.0, + 0.028571 + ], + [ + 4.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.046296, + 0.71875 + ], + [ + 0.154321, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.1, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.958333 + ], + [ + 1.0, + 2.0 + ] + ], + "speed1": [ + [ + 0.0, + -0.916667 + ], + [ + 3.7, + -2.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.9, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 5.5, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/oil-06-clean_prev.png b/stuff/library/mypaint brushes/tanda/oil-06-clean_prev.png new file mode 100644 index 0000000..402f30d Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/oil-06-clean_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/oil-06-paint.myb b/stuff/library/mypaint brushes/tanda/oil-06-paint.myb new file mode 100644 index 0000000..6ecdb04 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/oil-06-paint.myb @@ -0,0 +1,246 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/oil-06-paint", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 5.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.9, + "inputs": { + "speed1": [ + [ + 0.0, + 0.028571 + ], + [ + 4.0, + -0.2 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.046296, + 0.71875 + ], + [ + 0.154321, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.1, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.958333 + ], + [ + 1.0, + 2.0 + ] + ], + "speed1": [ + [ + 0.0, + -0.916667 + ], + [ + 3.7, + -2.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 2.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.5, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 5.5, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/oil-06-paint_prev.png b/stuff/library/mypaint brushes/tanda/oil-06-paint_prev.png new file mode 100644 index 0000000..41c8227 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/oil-06-paint_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/oil-mop.myb b/stuff/library/mypaint brushes/tanda/oil-mop.myb new file mode 100644 index 0000000..84abcf5 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/oil-mop.myb @@ -0,0 +1,260 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/oil-mop", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "stroke": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 3.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.033951, + 0.0625 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.2, + "inputs": { + "pressure": [ + [ + 0.0, + -0.687917 + ], + [ + 1.0, + 0.568854 + ] + ], + "speed1": [ + [ + 0.0, + 0.0 + ], + [ + 4.0, + 1.01 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/oil-mop_prev.png b/stuff/library/mypaint brushes/tanda/oil-mop_prev.png new file mode 100644 index 0000000..5325ced Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/oil-mop_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/pencil-2b.myb b/stuff/library/mypaint brushes/tanda/pencil-2b.myb new file mode 100644 index 0000000..a094b1a --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/pencil-2b.myb @@ -0,0 +1,228 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/pencil-2b", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 4.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.15, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.15, + "inputs": { + "pressure": [ + [ + 0.0, + -0.687917 + ], + [ + 0.752976, + 0.236471 + ], + [ + 1.0, + 0.286632 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/pencil-2b_prev.png b/stuff/library/mypaint brushes/tanda/pencil-2b_prev.png new file mode 100644 index 0000000..7e8f5f2 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/pencil-2b_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/pencil-8b.myb b/stuff/library/mypaint brushes/tanda/pencil-8b.myb new file mode 100644 index 0000000..8c0ab0d --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/pencil-8b.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "", + "settings": { + "anti_aliasing": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.53, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.9, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 1.0, + -0.5 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.15, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.0, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.8, + "inputs": { + "pressure": [ + [ + 0.0, + -4.5 + ], + [ + 0.758929, + -1.03125 + ], + [ + 1.0, + -1.546875 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/pencil-8b_prev.png b/stuff/library/mypaint brushes/tanda/pencil-8b_prev.png new file mode 100644 index 0000000..a1281b0 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/pencil-8b_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/splatter-02.myb b/stuff/library/mypaint brushes/tanda/splatter-02.myb new file mode 100644 index 0000000..8517a2f --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/splatter-02.myb @@ -0,0 +1,202 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/splatter-02", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.05, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.88, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 0.5, + "inputs": { + "pressure": [ + [ + 0.0, + -0.3 + ], + [ + 1.0, + 0.45 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 1.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 1.5, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 1.3, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 1.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 12.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/splatter-02_prev.png b/stuff/library/mypaint brushes/tanda/splatter-02_prev.png new file mode 100644 index 0000000..c20a273 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/splatter-02_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/splatter-04.myb b/stuff/library/mypaint brushes/tanda/splatter-04.myb new file mode 100644 index 0000000..d9bb3db --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/splatter-04.myb @@ -0,0 +1,239 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/splatter-04", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 10.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": { + "random": [ + [ + 0.0, + -0.2 + ], + [ + 1.0, + 0.2 + ] + ] + } + }, + "eraser": { + "base_value": 0.08, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": { + "speed1": [ + [ + 0.0, + 0.095714 + ], + [ + 4.0, + -0.67 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.3, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "speed1": [ + [ + 0.0, + -0.0 + ], + [ + 4.0, + -0.51 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 1.0, + "inputs": {} + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": { + "speed1": [ + [ + 0.0, + 1.0 + ], + [ + 2.107143, + -0.6875 + ], + [ + 4.0, + -1.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.05, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/splatter-04_prev.png b/stuff/library/mypaint brushes/tanda/splatter-04_prev.png new file mode 100644 index 0000000..03d801c Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/splatter-04_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/texture-03.myb b/stuff/library/mypaint brushes/tanda/texture-03.myb new file mode 100644 index 0000000..dd1c04f --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/texture-03.myb @@ -0,0 +1,223 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/texture-03", + "settings": { + "anti_aliasing": { + "base_value": 5.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + -0.3 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -0.5 + ], + [ + 1.0, + 0.5 + ] + ], + "stroke": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 9.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/texture-03_prev.png b/stuff/library/mypaint brushes/tanda/texture-03_prev.png new file mode 100644 index 0000000..0a74641 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/texture-03_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/texture-06.myb b/stuff/library/mypaint brushes/tanda/texture-06.myb new file mode 100644 index 0000000..341f441 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/texture-06.myb @@ -0,0 +1,244 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/texture-06", + "settings": { + "anti_aliasing": { + "base_value": 5.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "stroke": [ + [ + 0.0, + -0.3 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.5 + ], + [ + 1.0, + 0.5 + ] + ], + "stroke": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 10.0, + "inputs": { + "speed1": [ + [ + 0.0, + 9.0 + ], + [ + 4.0, + 9.0 + ] + ], + "speed2": [ + [ + 0.0, + 9.0 + ], + [ + 4.0, + 9.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.5, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": -0.5, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/texture-06_prev.png b/stuff/library/mypaint brushes/tanda/texture-06_prev.png new file mode 100644 index 0000000..33e8859 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/texture-06_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/texture-12.myb b/stuff/library/mypaint brushes/tanda/texture-12.myb new file mode 100644 index 0000000..174fef1 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/texture-12.myb @@ -0,0 +1,246 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/texture-12", + "settings": { + "anti_aliasing": { + "base_value": 2.51, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": { + "direction": [ + [ + 0.0, + 0.0 + ], + [ + 180.0, + 0.1 + ] + ] + } + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.2 + ], + [ + 1.0, + 0.2 + ] + ] + } + }, + "change_color_v": { + "base_value": 0.0, + "inputs": { + "random": [ + [ + 0.0, + -0.3 + ], + [ + 1.0, + 0.3 + ] + ] + } + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": { + "random": [ + [ + 0.0, + -3.0 + ], + [ + 1.0, + 3.0 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.8, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.5, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/texture-12_prev.png b/stuff/library/mypaint brushes/tanda/texture-12_prev.png new file mode 100644 index 0000000..93cd9b6 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/texture-12_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/water-01.myb b/stuff/library/mypaint brushes/tanda/water-01.myb new file mode 100644 index 0000000..8d1558c --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/water-01.myb @@ -0,0 +1,232 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/water-01", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.4, + "inputs": { + "random": [ + [ + 0.0, + -0.11 + ], + [ + 1.0, + 0.11 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 1.5, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 1.18, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.058642, + 0.427083 + ], + [ + 0.200617, + 0.677083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.1, + "inputs": { + "random": [ + [ + 0.0, + -1.5 + ], + [ + 1.0, + 1.5 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/water-01_prev.png b/stuff/library/mypaint brushes/tanda/water-01_prev.png new file mode 100644 index 0000000..4e8b95a Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/water-01_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/water-02.myb b/stuff/library/mypaint brushes/tanda/water-02.myb new file mode 100644 index 0000000..4d4cad0 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/water-02.myb @@ -0,0 +1,199 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/water-02", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 1.0, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.058642, + 0.427083 + ], + [ + 0.200617, + 0.677083 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.5, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 0.5, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 12.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/water-02_prev.png b/stuff/library/mypaint brushes/tanda/water-02_prev.png new file mode 100644 index 0000000..9b711aa Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/water-02_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/water-05.myb b/stuff/library/mypaint brushes/tanda/water-05.myb new file mode 100644 index 0000000..cb0a2ab --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/water-05.myb @@ -0,0 +1,199 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/water-05", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 80.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": {} + }, + "elliptical_dab_ratio": { + "base_value": 1.0, + "inputs": {} + }, + "eraser": { + "base_value": 0.0, + "inputs": {} + }, + "hardness": { + "base_value": 0.4, + "inputs": {} + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 2.0, + "inputs": {} + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": {} + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.040123, + 0.59375 + ], + [ + 0.154321, + 0.770833 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.5, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.0, + "inputs": {} + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/water-05_prev.png b/stuff/library/mypaint brushes/tanda/water-05_prev.png new file mode 100644 index 0000000..0d699a7 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/water-05_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/water-06.myb b/stuff/library/mypaint brushes/tanda/water-06.myb new file mode 100644 index 0000000..39537a0 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/water-06.myb @@ -0,0 +1,310 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/water-06", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 1.0, + -2.7 + ] + ], + "speed1": [ + [ + 0.0, + -0.5 + ], + [ + 0.148148, + 0.270833 + ], + [ + 4.0, + 0.5 + ] + ] + } + }, + "eraser": { + "base_value": 0.1, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.753086, + 0.0 + ], + [ + 1.0, + 0.5 + ] + ] + } + }, + "hardness": { + "base_value": 0.4, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.746914, + -0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 0.8 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "random": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.040123, + 0.885417 + ], + [ + 0.138889, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 3.2, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/water-06_prev.png b/stuff/library/mypaint brushes/tanda/water-06_prev.png new file mode 100644 index 0000000..96eda5e Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/water-06_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/watercolor-02-paint.myb b/stuff/library/mypaint brushes/tanda/watercolor-02-paint.myb new file mode 100644 index 0000000..e0f7542 --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/watercolor-02-paint.myb @@ -0,0 +1,327 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/watercolor-02-paint", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 1.0, + -2.7 + ] + ], + "speed1": [ + [ + 0.0, + -0.7 + ], + [ + 4.0, + 0.7 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.753086, + 0.0 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "hardness": { + "base_value": 0.4, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.746914, + -0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 0.8 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "random": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.040123, + 0.885417 + ], + [ + 0.138889, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.6, + "inputs": { + "pressure": [ + [ + 0.0, + -2.9 + ], + [ + 1.0, + 0.845833 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 0.95, + "inputs": { + "speed1": [ + [ + 0.0, + -0.1 + ], + [ + 4.0, + 0.1 + ] + ], + "stroke": [ + [ + 0.0, + 0.0 + ], + [ + 0.5, + 0.0 + ], + [ + 1.0, + 0.05 + ] + ] + } + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 6.5, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 10.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/watercolor-02-paint_prev.png b/stuff/library/mypaint brushes/tanda/watercolor-02-paint_prev.png new file mode 100644 index 0000000..ffb1382 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/watercolor-02-paint_prev.png differ diff --git a/stuff/library/mypaint brushes/tanda/watercolor-02-water.myb b/stuff/library/mypaint brushes/tanda/watercolor-02-water.myb new file mode 100644 index 0000000..bf8ec2e --- /dev/null +++ b/stuff/library/mypaint brushes/tanda/watercolor-02-water.myb @@ -0,0 +1,296 @@ +{ + "comment": "MyPaint brush file", + "group": "", + "parent_brush_name": "tanda/watercolor-02-water", + "settings": { + "anti_aliasing": { + "base_value": 1.0, + "inputs": {} + }, + "change_color_h": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsl_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_hsv_s": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_l": { + "base_value": 0.0, + "inputs": {} + }, + "change_color_v": { + "base_value": 0.0, + "inputs": {} + }, + "color_h": { + "base_value": 0.0, + "inputs": {} + }, + "color_s": { + "base_value": 0.0, + "inputs": {} + }, + "color_v": { + "base_value": 0.0, + "inputs": {} + }, + "colorize": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input": { + "base_value": 0.0, + "inputs": {} + }, + "custom_input_slowness": { + "base_value": 0.0, + "inputs": {} + }, + "dabs_per_actual_radius": { + "base_value": 2.0, + "inputs": {} + }, + "dabs_per_basic_radius": { + "base_value": 6.0, + "inputs": {} + }, + "dabs_per_second": { + "base_value": 0.0, + "inputs": {} + }, + "direction_filter": { + "base_value": 2.0, + "inputs": {} + }, + "elliptical_dab_angle": { + "base_value": 90.0, + "inputs": { + "random": [ + [ + 0.0, + -180.0 + ], + [ + 1.0, + 180.0 + ] + ] + } + }, + "elliptical_dab_ratio": { + "base_value": 4.0, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 1.0, + -2.7 + ] + ] + } + }, + "eraser": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.753086, + 0.0 + ], + [ + 1.0, + 0.1 + ] + ] + } + }, + "hardness": { + "base_value": 0.4, + "inputs": { + "pressure": [ + [ + 0.0, + -0.0 + ], + [ + 0.746914, + -0.0 + ], + [ + 1.0, + -0.3 + ] + ] + } + }, + "lock_alpha": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_random": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 0.8 + ] + ] + } + }, + "offset_by_speed": { + "base_value": 0.0, + "inputs": {} + }, + "offset_by_speed_slowness": { + "base_value": 1.0, + "inputs": {} + }, + "opaque": { + "base_value": 1.0, + "inputs": { + "random": [ + [ + 0.0, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "opaque_linearize": { + "base_value": 0.9, + "inputs": {} + }, + "opaque_multiply": { + "base_value": 0.0, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.040123, + 0.885417 + ], + [ + 0.138889, + 1.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "radius_by_random": { + "base_value": 0.0, + "inputs": {} + }, + "radius_logarithmic": { + "base_value": 2.6, + "inputs": { + "pressure": [ + [ + 0.0, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 1.0, + 1.0 + ] + ] + } + }, + "restore_color": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking": { + "base_value": 0.0, + "inputs": {} + }, + "slow_tracking_per_dab": { + "base_value": 0.0, + "inputs": {} + }, + "smudge": { + "base_value": 1.0, + "inputs": {} + }, + "smudge_length": { + "base_value": 0.1, + "inputs": {} + }, + "smudge_radius_log": { + "base_value": 0.0, + "inputs": {} + }, + "speed1_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed1_slowness": { + "base_value": 0.04, + "inputs": {} + }, + "speed2_gamma": { + "base_value": 4.0, + "inputs": {} + }, + "speed2_slowness": { + "base_value": 0.8, + "inputs": {} + }, + "stroke_duration_logarithmic": { + "base_value": 4.0, + "inputs": {} + }, + "stroke_holdtime": { + "base_value": 0.0, + "inputs": {} + }, + "stroke_threshold": { + "base_value": 0.0, + "inputs": {} + }, + "tracking_noise": { + "base_value": 0.0, + "inputs": {} + } + }, + "version": 3 +} \ No newline at end of file diff --git a/stuff/library/mypaint brushes/tanda/watercolor-02-water_prev.png b/stuff/library/mypaint brushes/tanda/watercolor-02-water_prev.png new file mode 100644 index 0000000..8b82414 Binary files /dev/null and b/stuff/library/mypaint brushes/tanda/watercolor-02-water_prev.png differ diff --git a/thirdparty/libmypaint/.gitignore b/thirdparty/libmypaint/.gitignore new file mode 100644 index 0000000..a1c07e8 --- /dev/null +++ b/thirdparty/libmypaint/.gitignore @@ -0,0 +1,3 @@ +/build/ +/download/ +/src/ diff --git a/thirdparty/libmypaint/README b/thirdparty/libmypaint/README new file mode 100644 index 0000000..4b0866d --- /dev/null +++ b/thirdparty/libmypaint/README @@ -0,0 +1,18 @@ +Scripts for cross-build libmypaint for Windows (MinGW) under Debian 8 Jessie + +1. install mingw toolchain (via apt-get for ex) + +2. run ./build-all.sh + +---------------- + +files: + + build-all.sh - script to do all things + + build.sh - build selected library (for ex: ./build.sh 64 json-c) + + download-all.sh - download and unpack all sources + + mingw-vars.sh - configuration of MinGW toolchain, configured for Debian 8 + \ No newline at end of file diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush-settings-gen.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush-settings-gen.h new file mode 100644 index 0000000..77e0932 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush-settings-gen.h @@ -0,0 +1,98 @@ +// DO NOT EDIT - autogenerated by generate.py + +typedef enum { + MYPAINT_BRUSH_INPUT_PRESSURE, + MYPAINT_BRUSH_INPUT_SPEED1, + MYPAINT_BRUSH_INPUT_SPEED2, + MYPAINT_BRUSH_INPUT_RANDOM, + MYPAINT_BRUSH_INPUT_STROKE, + MYPAINT_BRUSH_INPUT_DIRECTION, + MYPAINT_BRUSH_INPUT_TILT_DECLINATION, + MYPAINT_BRUSH_INPUT_TILT_ASCENSION, + MYPAINT_BRUSH_INPUT_CUSTOM, + MYPAINT_BRUSH_INPUTS_COUNT +} MyPaintBrushInput; + +typedef enum { + MYPAINT_BRUSH_SETTING_OPAQUE, + MYPAINT_BRUSH_SETTING_OPAQUE_MULTIPLY, + MYPAINT_BRUSH_SETTING_OPAQUE_LINEARIZE, + MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, + MYPAINT_BRUSH_SETTING_HARDNESS, + MYPAINT_BRUSH_SETTING_ANTI_ALIASING, + MYPAINT_BRUSH_SETTING_DABS_PER_BASIC_RADIUS, + MYPAINT_BRUSH_SETTING_DABS_PER_ACTUAL_RADIUS, + MYPAINT_BRUSH_SETTING_DABS_PER_SECOND, + MYPAINT_BRUSH_SETTING_RADIUS_BY_RANDOM, + MYPAINT_BRUSH_SETTING_SPEED1_SLOWNESS, + MYPAINT_BRUSH_SETTING_SPEED2_SLOWNESS, + MYPAINT_BRUSH_SETTING_SPEED1_GAMMA, + MYPAINT_BRUSH_SETTING_SPEED2_GAMMA, + MYPAINT_BRUSH_SETTING_OFFSET_BY_RANDOM, + MYPAINT_BRUSH_SETTING_OFFSET_BY_SPEED, + MYPAINT_BRUSH_SETTING_OFFSET_BY_SPEED_SLOWNESS, + MYPAINT_BRUSH_SETTING_SLOW_TRACKING, + MYPAINT_BRUSH_SETTING_SLOW_TRACKING_PER_DAB, + MYPAINT_BRUSH_SETTING_TRACKING_NOISE, + MYPAINT_BRUSH_SETTING_COLOR_H, + MYPAINT_BRUSH_SETTING_COLOR_S, + MYPAINT_BRUSH_SETTING_COLOR_V, + MYPAINT_BRUSH_SETTING_RESTORE_COLOR, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_H, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_L, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_HSL_S, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_V, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_HSV_S, + MYPAINT_BRUSH_SETTING_SMUDGE, + MYPAINT_BRUSH_SETTING_SMUDGE_LENGTH, + MYPAINT_BRUSH_SETTING_SMUDGE_RADIUS_LOG, + MYPAINT_BRUSH_SETTING_ERASER, + MYPAINT_BRUSH_SETTING_STROKE_THRESHOLD, + MYPAINT_BRUSH_SETTING_STROKE_DURATION_LOGARITHMIC, + MYPAINT_BRUSH_SETTING_STROKE_HOLDTIME, + MYPAINT_BRUSH_SETTING_CUSTOM_INPUT, + MYPAINT_BRUSH_SETTING_CUSTOM_INPUT_SLOWNESS, + MYPAINT_BRUSH_SETTING_ELLIPTICAL_DAB_RATIO, + MYPAINT_BRUSH_SETTING_ELLIPTICAL_DAB_ANGLE, + MYPAINT_BRUSH_SETTING_DIRECTION_FILTER, + MYPAINT_BRUSH_SETTING_LOCK_ALPHA, + MYPAINT_BRUSH_SETTING_COLORIZE, + MYPAINT_BRUSH_SETTING_SNAP_TO_PIXEL, + MYPAINT_BRUSH_SETTING_PRESSURE_GAIN_LOG, + MYPAINT_BRUSH_SETTINGS_COUNT +} MyPaintBrushSetting; + +typedef enum { + MYPAINT_BRUSH_STATE_X, + MYPAINT_BRUSH_STATE_Y, + MYPAINT_BRUSH_STATE_PRESSURE, + MYPAINT_BRUSH_STATE_PARTIAL_DABS, + MYPAINT_BRUSH_STATE_ACTUAL_RADIUS, + MYPAINT_BRUSH_STATE_SMUDGE_RA, + MYPAINT_BRUSH_STATE_SMUDGE_GA, + MYPAINT_BRUSH_STATE_SMUDGE_BA, + MYPAINT_BRUSH_STATE_SMUDGE_A, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_R, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_G, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_B, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_A, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_RECENTNESS, + MYPAINT_BRUSH_STATE_ACTUAL_X, + MYPAINT_BRUSH_STATE_ACTUAL_Y, + MYPAINT_BRUSH_STATE_NORM_DX_SLOW, + MYPAINT_BRUSH_STATE_NORM_DY_SLOW, + MYPAINT_BRUSH_STATE_NORM_SPEED1_SLOW, + MYPAINT_BRUSH_STATE_NORM_SPEED2_SLOW, + MYPAINT_BRUSH_STATE_STROKE, + MYPAINT_BRUSH_STATE_STROKE_STARTED, + MYPAINT_BRUSH_STATE_CUSTOM_INPUT, + MYPAINT_BRUSH_STATE_RNG_SEED, + MYPAINT_BRUSH_STATE_ACTUAL_ELLIPTICAL_DAB_RATIO, + MYPAINT_BRUSH_STATE_ACTUAL_ELLIPTICAL_DAB_ANGLE, + MYPAINT_BRUSH_STATE_DIRECTION_DX, + MYPAINT_BRUSH_STATE_DIRECTION_DY, + MYPAINT_BRUSH_STATE_DECLINATION, + MYPAINT_BRUSH_STATE_ASCENSION, + MYPAINT_BRUSH_STATES_COUNT +} MyPaintBrushState; + diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush-settings.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush-settings.h new file mode 100644 index 0000000..221d257 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush-settings.h @@ -0,0 +1,71 @@ +#ifndef MYPAINTBRUSHSETTINGS_H +#define MYPAINTBRUSHSETTINGS_H + +/* libmypaint - The MyPaint Brush Library + * Copyright (C) 2012 Jon Nordby + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct { + const gchar *cname; + const gchar *name; // FIXME: needs to be accessed through gettext + gboolean constant; + float min; + float def; // default + float max; + const gchar *tooltip; // FIXME: needs to be accessed through gettext +} MyPaintBrushSettingInfo; + +const MyPaintBrushSettingInfo * +mypaint_brush_setting_info(MyPaintBrushSetting id); + +const gchar * +mypaint_brush_setting_info_get_name(const MyPaintBrushSettingInfo *self); +const gchar * +mypaint_brush_setting_info_get_tooltip(const MyPaintBrushSettingInfo *self); +MyPaintBrushSetting +mypaint_brush_setting_from_cname(const char *cname); + +typedef struct { + const gchar *cname; + float hard_min; + float soft_min; + float normal; + float soft_max; + float hard_max; + const gchar *name; // FIXME: needs to be accessed through gettext + const gchar *tooltip; // FIXME: needs to be accessed through gettext +} MyPaintBrushInputInfo; + +const MyPaintBrushInputInfo * +mypaint_brush_input_info(MyPaintBrushInput id); + +const gchar * +mypaint_brush_input_info_get_name(const MyPaintBrushInputInfo *self); + +const gchar * +mypaint_brush_input_info_get_tooltip(const MyPaintBrushInputInfo *self); + +MyPaintBrushInput +mypaint_brush_input_from_cname(const char *cname); + +G_END_DECLS + +#endif // MYPAINTBRUSHSETTINGS_H diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush.h new file mode 100644 index 0000000..837ed03 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-brush.h @@ -0,0 +1,93 @@ +#ifndef MYPAINTBRUSH_H +#define MYPAINTBRUSH_H + +/* libmypaint - The MyPaint Brush Library + * Copyright (C) 2008 Martin Renold + * Copyright (C) 2012 Jon Nordby + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct MyPaintBrush MyPaintBrush; + +MyPaintBrush * +mypaint_brush_new(void); + +void +mypaint_brush_unref(MyPaintBrush *self); +void +mypaint_brush_ref(MyPaintBrush *self); + +void +mypaint_brush_reset(MyPaintBrush *self); + +void +mypaint_brush_new_stroke(MyPaintBrush *self); + +int +mypaint_brush_stroke_to(MyPaintBrush *self, MyPaintSurface *surface, float x, float y, + float pressure, float xtilt, float ytilt, double dtime); + +void +mypaint_brush_set_base_value(MyPaintBrush *self, MyPaintBrushSetting id, float value); + +float +mypaint_brush_get_base_value(MyPaintBrush *self, MyPaintBrushSetting id); + +gboolean +mypaint_brush_is_constant(MyPaintBrush *self, MyPaintBrushSetting id); + +int +mypaint_brush_get_inputs_used_n(MyPaintBrush *self, MyPaintBrushSetting id); + +void +mypaint_brush_set_mapping_n(MyPaintBrush *self, MyPaintBrushSetting id, MyPaintBrushInput input, int n); + +int +mypaint_brush_get_mapping_n(MyPaintBrush *self, MyPaintBrushSetting id, MyPaintBrushInput input); + +void +mypaint_brush_set_mapping_point(MyPaintBrush *self, MyPaintBrushSetting id, MyPaintBrushInput input, int index, float x, float y); + +void +mypaint_brush_get_mapping_point(MyPaintBrush *self, MyPaintBrushSetting id, MyPaintBrushInput input, int index, float *x, float *y); + +float +mypaint_brush_get_state(MyPaintBrush *self, MyPaintBrushState i); + +void +mypaint_brush_set_state(MyPaintBrush *self, MyPaintBrushState i, float value); + +double +mypaint_brush_get_total_stroke_painting_time(MyPaintBrush *self); + +void +mypaint_brush_set_print_inputs(MyPaintBrush *self, gboolean enabled); + +void +mypaint_brush_from_defaults(MyPaintBrush *self); + + +gboolean +mypaint_brush_from_string(MyPaintBrush *self, const char *string); + + +G_END_DECLS + +#endif // MYPAINTBRUSH_H diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-config.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-config.h new file mode 100644 index 0000000..55e6093 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-config.h @@ -0,0 +1,16 @@ +#ifndef MYPAINTCONFIG_H +#define MYPAINTCONFIG_H + +#ifndef MYPAINT_TILE_SIZE +#define MYPAINT_TILE_SIZE 64 +#endif + +#ifndef MYPAINT_MAX_THREADS +#define MYPAINT_MAX_THREADS 16 +#endif + +#ifndef MYPAINT_MAX_MIPMAP_LEVEL +#define MYPAINT_MAX_MIPMAP_LEVEL 4 +#endif + +#endif /* MYPAINTCONFIG_H */ diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-fixed-tiled-surface.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-fixed-tiled-surface.h new file mode 100644 index 0000000..53445ff --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-fixed-tiled-surface.h @@ -0,0 +1,34 @@ +#ifndef MYPAINTFIXEDTILEDSURFACE_H +#define MYPAINTFIXEDTILEDSURFACE_H + +#include +#include +#include + +G_BEGIN_DECLS + +/** + * MyPaintFixedTiledSurface: + * + * Simple #MyPaintTiledSurface subclass that implements a fixed sized #MyPaintSurface. + * Only intended for testing and trivial use-cases, and to serve as an example of + * how to implement a tiled surface subclass. + */ +typedef struct MyPaintFixedTiledSurface MyPaintFixedTiledSurface; + +MyPaintFixedTiledSurface * +mypaint_fixed_tiled_surface_new(int width, int height); + +int +mypaint_fixed_tiled_surface_get_width(MyPaintFixedTiledSurface *self); + +int +mypaint_fixed_tiled_surface_get_height(MyPaintFixedTiledSurface *self); + + +MyPaintSurface * +mypaint_fixed_tiled_surface_interface(MyPaintFixedTiledSurface *self); + +G_END_DECLS + +#endif // MYPAINTFIXEDTILEDSURFACE_H diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-glib-compat.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-glib-compat.h new file mode 100644 index 0000000..bded620 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-glib-compat.h @@ -0,0 +1,32 @@ +#ifndef MYPAINTGLIBCOMPAT_H +#define MYPAINTGLIBCOMPAT_H + +#include + +#ifndef __G_LIB_H__ + +/* From $INCLUDEPATH/glib-2.0/glib/gmacros.h */ +#ifdef __cplusplus +# define G_BEGIN_DECLS extern "C" { +# define G_END_DECLS } +#else +# define G_BEGIN_DECLS +# define G_END_DECLS +#endif + +#define FALSE (0) +#define TRUE (!FALSE) + +typedef void * gpointer; + +/* From $INCLUDEPATH/glib-2.0/glib/gtypes.h */ +typedef char gchar; +typedef int gint; +typedef gint gboolean; + +/* From $LIBPATH/glib-2.0/include/glibconfig.h */ +typedef unsigned short guint16; + +#endif // __G_LIB_H__ + +#endif // MYPAINTGLIBCOMPAT_H diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-mapping.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-mapping.h new file mode 100644 index 0000000..a58e5d1 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-mapping.h @@ -0,0 +1,27 @@ +#ifndef MAPPING_H +#define MAPPING_H + +#include +#include + +G_BEGIN_DECLS + +typedef struct MyPaintMapping MyPaintMapping; + +MyPaintMapping * mypaint_mapping_new(int inputs_); +void mypaint_mapping_free(MyPaintMapping *self); +float mypaint_mapping_get_base_value(MyPaintMapping *self); +void mypaint_mapping_set_base_value(MyPaintMapping *self, float value); +void mypaint_mapping_set_n (MyPaintMapping * self, int input, int n); +int mypaint_mapping_get_n (MyPaintMapping * self, int input); +void mypaint_mapping_set_point (MyPaintMapping * self, int input, int index, float x, float y); +void mypaint_mapping_get_point (MyPaintMapping * self, int input, int index, float *x, float *y); +gboolean mypaint_mapping_is_constant(MyPaintMapping * self); +int mypaint_mapping_get_inputs_used_n(MyPaintMapping *self); +float mypaint_mapping_calculate (MyPaintMapping * self, float * data); +float mypaint_mapping_calculate_single_input (MyPaintMapping * self, float input); + + +G_END_DECLS + +#endif // MAPPING_H diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-rectangle.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-rectangle.h new file mode 100644 index 0000000..e08c68e --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-rectangle.h @@ -0,0 +1,39 @@ +#ifndef MYPAINTRECTANGLE_H +#define MYPAINTRECTANGLE_H + +/* libmypaint - The MyPaint Brush Library + * Copyright (C) 2008 Martin Renold + * Copyright (C) 2012 Jon Nordby + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +G_BEGIN_DECLS + +typedef struct { + int x; + int y; + int width; + int height; +} MyPaintRectangle; + +void mypaint_rectangle_expand_to_include_point(MyPaintRectangle *r, int x, int y); +MyPaintRectangle * +mypaint_rectangle_copy(MyPaintRectangle *self); + +G_END_DECLS + +#endif // MYPAINTRECTANGLE_H diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-surface.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-surface.h new file mode 100644 index 0000000..1217a76 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-surface.h @@ -0,0 +1,109 @@ +#ifndef MYPAINTSURFACE_H +#define MYPAINTSURFACE_H + +/* libmypaint - The MyPaint Brush Library + * Copyright (C) 2008 Martin Renold + * Copyright (C) 2012 Jon Nordby + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +G_BEGIN_DECLS + +typedef struct MyPaintSurface MyPaintSurface; + +typedef void (*MyPaintSurfaceGetColorFunction) (MyPaintSurface *self, + float x, float y, + float radius, + float * color_r, float * color_g, float * color_b, float * color_a + ); +typedef int (*MyPaintSurfaceDrawDabFunction) (MyPaintSurface *self, + float x, float y, + float radius, + float color_r, float color_g, float color_b, + float opaque, float hardness, + float alpha_eraser, + float aspect_ratio, float angle, + float lock_alpha, + float colorize); + +typedef void (*MyPaintSurfaceDestroyFunction) (MyPaintSurface *self); + +typedef void (*MyPaintSurfaceSavePngFunction) (MyPaintSurface *self, const char *path, int x, int y, int width, int height); + +typedef void (*MyPaintSurfaceBeginAtomicFunction) (MyPaintSurface *self); + +typedef void (*MyPaintSurfaceEndAtomicFunction) (MyPaintSurface *self, MyPaintRectangle *roi); + +/** + * MyPaintSurface: + * + * Abstract surface type for the MyPaint brush engine. The surface interface + * lets the brush engine specify dabs to render, and to pick color. + */ +struct MyPaintSurface { + MyPaintSurfaceDrawDabFunction draw_dab; + MyPaintSurfaceGetColorFunction get_color; + MyPaintSurfaceBeginAtomicFunction begin_atomic; + MyPaintSurfaceEndAtomicFunction end_atomic; + MyPaintSurfaceDestroyFunction destroy; + MyPaintSurfaceSavePngFunction save_png; + int refcount; +}; + +/** + * mypaint_surface_draw_dab: + * + * Draw a dab onto the surface. + */ +int +mypaint_surface_draw_dab(MyPaintSurface *self, + float x, float y, + float radius, + float color_r, float color_g, float color_b, + float opaque, float hardness, + float alpha_eraser, + float aspect_ratio, float angle, + float lock_alpha, + float colorize + ); + + +void +mypaint_surface_get_color(MyPaintSurface *self, + float x, float y, + float radius, + float * color_r, float * color_g, float * color_b, float * color_a + ); + +float +mypaint_surface_get_alpha (MyPaintSurface *self, float x, float y, float radius); + +void +mypaint_surface_save_png(MyPaintSurface *self, const char *path, int x, int y, int width, int height); + +void mypaint_surface_begin_atomic(MyPaintSurface *self); + +void mypaint_surface_end_atomic(MyPaintSurface *self, MyPaintRectangle *roi); + +void mypaint_surface_init(MyPaintSurface *self); +void mypaint_surface_ref(MyPaintSurface *self); +void mypaint_surface_unref(MyPaintSurface *self); + +G_END_DECLS + +#endif // MYPAINTSURFACE_H + diff --git a/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-tiled-surface.h b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-tiled-surface.h new file mode 100644 index 0000000..b225f7b --- /dev/null +++ b/thirdparty/libmypaint/dist/32/include/libmypaint/mypaint-tiled-surface.h @@ -0,0 +1,86 @@ +#ifndef MYPAINTTILEDSURFACE_H +#define MYPAINTTILEDSURFACE_H + +#include +#include +#include + +typedef enum { + MYPAINT_SYMMETRY_TYPE_VERTICAL, + MYPAINT_SYMMETRY_TYPE_HORIZONTAL, + MYPAINT_SYMMETRY_TYPE_VERTHORZ, + MYPAINT_SYMMETRY_TYPE_ROTATIONAL, + MYPAINT_SYMMETRY_TYPE_SNOWFLAKE, + MYPAINT_SYMMETRY_TYPES_COUNT +} MyPaintSymmetryType; + +G_BEGIN_DECLS + +typedef struct MyPaintTiledSurface MyPaintTiledSurface; + +typedef struct { + int tx; + int ty; + gboolean readonly; + guint16 *buffer; + gpointer context; /* Only to be used by the surface implemenations. */ + int thread_id; + int mipmap_level; +} MyPaintTileRequest; + +void +mypaint_tile_request_init(MyPaintTileRequest *data, int level, + int tx, int ty, gboolean readonly); + +typedef void (*MyPaintTileRequestStartFunction) (MyPaintTiledSurface *self, MyPaintTileRequest *request); +typedef void (*MyPaintTileRequestEndFunction) (MyPaintTiledSurface *self, MyPaintTileRequest *request); +typedef void (*MyPaintTiledSurfaceAreaChanged) (MyPaintTiledSurface *self, int bb_x, int bb_y, int bb_w, int bb_h); + +/** + * MyPaintTiledSurface: + * + * Interface and convenience class for implementing a #MyPaintSurface backed by a tile store. + * + * The size of the surface is infinite, and consumers need just implement two vfuncs. + */ +struct MyPaintTiledSurface { + MyPaintSurface parent; + /* private: */ + MyPaintTileRequestStartFunction tile_request_start; + MyPaintTileRequestEndFunction tile_request_end; + gboolean surface_do_symmetry; + MyPaintSymmetryType symmetry_type; + float surface_center_x; + float surface_center_y; + int rot_symmetry_lines; + struct OperationQueue *operation_queue; + MyPaintRectangle dirty_bbox; + gboolean threadsafe_tile_requests; + int tile_size; +}; + +void +mypaint_tiled_surface_init(MyPaintTiledSurface *self, + MyPaintTileRequestStartFunction tile_request_start, + MyPaintTileRequestEndFunction tile_request_end); + +void +mypaint_tiled_surface_destroy(MyPaintTiledSurface *self); + +void +mypaint_tiled_surface_set_symmetry_state(MyPaintTiledSurface *self, gboolean active, + float center_x, float center_y, + MyPaintSymmetryType symmetry_type, + int rot_symmetry_lines); +float +mypaint_tiled_surface_get_alpha (MyPaintTiledSurface *self, float x, float y, float radius); + +void mypaint_tiled_surface_tile_request_start(MyPaintTiledSurface *self, MyPaintTileRequest *request); +void mypaint_tiled_surface_tile_request_end(MyPaintTiledSurface *self, MyPaintTileRequest *request); + +void mypaint_tiled_surface_begin_atomic(MyPaintTiledSurface *self); +void mypaint_tiled_surface_end_atomic(MyPaintTiledSurface *self, MyPaintRectangle *roi); + +G_END_DECLS + +#endif // MYPAINTTILEDSURFACE_H diff --git a/thirdparty/libmypaint/dist/32/libiconv-2.dll b/thirdparty/libmypaint/dist/32/libiconv-2.dll new file mode 100755 index 0000000..9f62fac --- /dev/null +++ b/thirdparty/libmypaint/dist/32/libiconv-2.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3078c54ef5c185ca5fe25d9dddc15a258bf46357b1951132b042ef661b2bc936 +size 1101423 diff --git a/thirdparty/libmypaint/dist/32/libintl-8.dll b/thirdparty/libmypaint/dist/32/libintl-8.dll new file mode 100755 index 0000000..59fbc5a --- /dev/null +++ b/thirdparty/libmypaint/dist/32/libintl-8.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb73cf22089da6390c1def079b58e7b73cb27ce7902e48883f5becae20df97b2 +size 333677 diff --git a/thirdparty/libmypaint/dist/32/libjson-c-2.dll b/thirdparty/libmypaint/dist/32/libjson-c-2.dll new file mode 100755 index 0000000..87f1866 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/libjson-c-2.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03e90abbbc0c72b3832b7cb1fb62df3bc41d9fc170caf1eec777a69857dffd29 +size 216247 diff --git a/thirdparty/libmypaint/dist/32/libmypaint-1-4-0.dll b/thirdparty/libmypaint/dist/32/libmypaint-1-4-0.dll new file mode 100755 index 0000000..c6fc3f6 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/libmypaint-1-4-0.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:426748f0de42310541d59537396caf7f6e8c194b1c4481e29f5522407c4e0d32 +size 306114 diff --git a/thirdparty/libmypaint/dist/32/libmypaint.lib b/thirdparty/libmypaint/dist/32/libmypaint.lib new file mode 100755 index 0000000..7537481 --- /dev/null +++ b/thirdparty/libmypaint/dist/32/libmypaint.lib @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c2ce3325bab78ac76de865e39276ccc35b16b053224d5d651e007a8672c59de +size 86606 diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush-settings-gen.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush-settings-gen.h new file mode 100644 index 0000000..77e0932 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush-settings-gen.h @@ -0,0 +1,98 @@ +// DO NOT EDIT - autogenerated by generate.py + +typedef enum { + MYPAINT_BRUSH_INPUT_PRESSURE, + MYPAINT_BRUSH_INPUT_SPEED1, + MYPAINT_BRUSH_INPUT_SPEED2, + MYPAINT_BRUSH_INPUT_RANDOM, + MYPAINT_BRUSH_INPUT_STROKE, + MYPAINT_BRUSH_INPUT_DIRECTION, + MYPAINT_BRUSH_INPUT_TILT_DECLINATION, + MYPAINT_BRUSH_INPUT_TILT_ASCENSION, + MYPAINT_BRUSH_INPUT_CUSTOM, + MYPAINT_BRUSH_INPUTS_COUNT +} MyPaintBrushInput; + +typedef enum { + MYPAINT_BRUSH_SETTING_OPAQUE, + MYPAINT_BRUSH_SETTING_OPAQUE_MULTIPLY, + MYPAINT_BRUSH_SETTING_OPAQUE_LINEARIZE, + MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, + MYPAINT_BRUSH_SETTING_HARDNESS, + MYPAINT_BRUSH_SETTING_ANTI_ALIASING, + MYPAINT_BRUSH_SETTING_DABS_PER_BASIC_RADIUS, + MYPAINT_BRUSH_SETTING_DABS_PER_ACTUAL_RADIUS, + MYPAINT_BRUSH_SETTING_DABS_PER_SECOND, + MYPAINT_BRUSH_SETTING_RADIUS_BY_RANDOM, + MYPAINT_BRUSH_SETTING_SPEED1_SLOWNESS, + MYPAINT_BRUSH_SETTING_SPEED2_SLOWNESS, + MYPAINT_BRUSH_SETTING_SPEED1_GAMMA, + MYPAINT_BRUSH_SETTING_SPEED2_GAMMA, + MYPAINT_BRUSH_SETTING_OFFSET_BY_RANDOM, + MYPAINT_BRUSH_SETTING_OFFSET_BY_SPEED, + MYPAINT_BRUSH_SETTING_OFFSET_BY_SPEED_SLOWNESS, + MYPAINT_BRUSH_SETTING_SLOW_TRACKING, + MYPAINT_BRUSH_SETTING_SLOW_TRACKING_PER_DAB, + MYPAINT_BRUSH_SETTING_TRACKING_NOISE, + MYPAINT_BRUSH_SETTING_COLOR_H, + MYPAINT_BRUSH_SETTING_COLOR_S, + MYPAINT_BRUSH_SETTING_COLOR_V, + MYPAINT_BRUSH_SETTING_RESTORE_COLOR, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_H, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_L, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_HSL_S, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_V, + MYPAINT_BRUSH_SETTING_CHANGE_COLOR_HSV_S, + MYPAINT_BRUSH_SETTING_SMUDGE, + MYPAINT_BRUSH_SETTING_SMUDGE_LENGTH, + MYPAINT_BRUSH_SETTING_SMUDGE_RADIUS_LOG, + MYPAINT_BRUSH_SETTING_ERASER, + MYPAINT_BRUSH_SETTING_STROKE_THRESHOLD, + MYPAINT_BRUSH_SETTING_STROKE_DURATION_LOGARITHMIC, + MYPAINT_BRUSH_SETTING_STROKE_HOLDTIME, + MYPAINT_BRUSH_SETTING_CUSTOM_INPUT, + MYPAINT_BRUSH_SETTING_CUSTOM_INPUT_SLOWNESS, + MYPAINT_BRUSH_SETTING_ELLIPTICAL_DAB_RATIO, + MYPAINT_BRUSH_SETTING_ELLIPTICAL_DAB_ANGLE, + MYPAINT_BRUSH_SETTING_DIRECTION_FILTER, + MYPAINT_BRUSH_SETTING_LOCK_ALPHA, + MYPAINT_BRUSH_SETTING_COLORIZE, + MYPAINT_BRUSH_SETTING_SNAP_TO_PIXEL, + MYPAINT_BRUSH_SETTING_PRESSURE_GAIN_LOG, + MYPAINT_BRUSH_SETTINGS_COUNT +} MyPaintBrushSetting; + +typedef enum { + MYPAINT_BRUSH_STATE_X, + MYPAINT_BRUSH_STATE_Y, + MYPAINT_BRUSH_STATE_PRESSURE, + MYPAINT_BRUSH_STATE_PARTIAL_DABS, + MYPAINT_BRUSH_STATE_ACTUAL_RADIUS, + MYPAINT_BRUSH_STATE_SMUDGE_RA, + MYPAINT_BRUSH_STATE_SMUDGE_GA, + MYPAINT_BRUSH_STATE_SMUDGE_BA, + MYPAINT_BRUSH_STATE_SMUDGE_A, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_R, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_G, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_B, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_A, + MYPAINT_BRUSH_STATE_LAST_GETCOLOR_RECENTNESS, + MYPAINT_BRUSH_STATE_ACTUAL_X, + MYPAINT_BRUSH_STATE_ACTUAL_Y, + MYPAINT_BRUSH_STATE_NORM_DX_SLOW, + MYPAINT_BRUSH_STATE_NORM_DY_SLOW, + MYPAINT_BRUSH_STATE_NORM_SPEED1_SLOW, + MYPAINT_BRUSH_STATE_NORM_SPEED2_SLOW, + MYPAINT_BRUSH_STATE_STROKE, + MYPAINT_BRUSH_STATE_STROKE_STARTED, + MYPAINT_BRUSH_STATE_CUSTOM_INPUT, + MYPAINT_BRUSH_STATE_RNG_SEED, + MYPAINT_BRUSH_STATE_ACTUAL_ELLIPTICAL_DAB_RATIO, + MYPAINT_BRUSH_STATE_ACTUAL_ELLIPTICAL_DAB_ANGLE, + MYPAINT_BRUSH_STATE_DIRECTION_DX, + MYPAINT_BRUSH_STATE_DIRECTION_DY, + MYPAINT_BRUSH_STATE_DECLINATION, + MYPAINT_BRUSH_STATE_ASCENSION, + MYPAINT_BRUSH_STATES_COUNT +} MyPaintBrushState; + diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush-settings.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush-settings.h new file mode 100644 index 0000000..221d257 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush-settings.h @@ -0,0 +1,71 @@ +#ifndef MYPAINTBRUSHSETTINGS_H +#define MYPAINTBRUSHSETTINGS_H + +/* libmypaint - The MyPaint Brush Library + * Copyright (C) 2012 Jon Nordby + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct { + const gchar *cname; + const gchar *name; // FIXME: needs to be accessed through gettext + gboolean constant; + float min; + float def; // default + float max; + const gchar *tooltip; // FIXME: needs to be accessed through gettext +} MyPaintBrushSettingInfo; + +const MyPaintBrushSettingInfo * +mypaint_brush_setting_info(MyPaintBrushSetting id); + +const gchar * +mypaint_brush_setting_info_get_name(const MyPaintBrushSettingInfo *self); +const gchar * +mypaint_brush_setting_info_get_tooltip(const MyPaintBrushSettingInfo *self); +MyPaintBrushSetting +mypaint_brush_setting_from_cname(const char *cname); + +typedef struct { + const gchar *cname; + float hard_min; + float soft_min; + float normal; + float soft_max; + float hard_max; + const gchar *name; // FIXME: needs to be accessed through gettext + const gchar *tooltip; // FIXME: needs to be accessed through gettext +} MyPaintBrushInputInfo; + +const MyPaintBrushInputInfo * +mypaint_brush_input_info(MyPaintBrushInput id); + +const gchar * +mypaint_brush_input_info_get_name(const MyPaintBrushInputInfo *self); + +const gchar * +mypaint_brush_input_info_get_tooltip(const MyPaintBrushInputInfo *self); + +MyPaintBrushInput +mypaint_brush_input_from_cname(const char *cname); + +G_END_DECLS + +#endif // MYPAINTBRUSHSETTINGS_H diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush.h new file mode 100644 index 0000000..837ed03 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-brush.h @@ -0,0 +1,93 @@ +#ifndef MYPAINTBRUSH_H +#define MYPAINTBRUSH_H + +/* libmypaint - The MyPaint Brush Library + * Copyright (C) 2008 Martin Renold + * Copyright (C) 2012 Jon Nordby + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct MyPaintBrush MyPaintBrush; + +MyPaintBrush * +mypaint_brush_new(void); + +void +mypaint_brush_unref(MyPaintBrush *self); +void +mypaint_brush_ref(MyPaintBrush *self); + +void +mypaint_brush_reset(MyPaintBrush *self); + +void +mypaint_brush_new_stroke(MyPaintBrush *self); + +int +mypaint_brush_stroke_to(MyPaintBrush *self, MyPaintSurface *surface, float x, float y, + float pressure, float xtilt, float ytilt, double dtime); + +void +mypaint_brush_set_base_value(MyPaintBrush *self, MyPaintBrushSetting id, float value); + +float +mypaint_brush_get_base_value(MyPaintBrush *self, MyPaintBrushSetting id); + +gboolean +mypaint_brush_is_constant(MyPaintBrush *self, MyPaintBrushSetting id); + +int +mypaint_brush_get_inputs_used_n(MyPaintBrush *self, MyPaintBrushSetting id); + +void +mypaint_brush_set_mapping_n(MyPaintBrush *self, MyPaintBrushSetting id, MyPaintBrushInput input, int n); + +int +mypaint_brush_get_mapping_n(MyPaintBrush *self, MyPaintBrushSetting id, MyPaintBrushInput input); + +void +mypaint_brush_set_mapping_point(MyPaintBrush *self, MyPaintBrushSetting id, MyPaintBrushInput input, int index, float x, float y); + +void +mypaint_brush_get_mapping_point(MyPaintBrush *self, MyPaintBrushSetting id, MyPaintBrushInput input, int index, float *x, float *y); + +float +mypaint_brush_get_state(MyPaintBrush *self, MyPaintBrushState i); + +void +mypaint_brush_set_state(MyPaintBrush *self, MyPaintBrushState i, float value); + +double +mypaint_brush_get_total_stroke_painting_time(MyPaintBrush *self); + +void +mypaint_brush_set_print_inputs(MyPaintBrush *self, gboolean enabled); + +void +mypaint_brush_from_defaults(MyPaintBrush *self); + + +gboolean +mypaint_brush_from_string(MyPaintBrush *self, const char *string); + + +G_END_DECLS + +#endif // MYPAINTBRUSH_H diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-config.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-config.h new file mode 100644 index 0000000..55e6093 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-config.h @@ -0,0 +1,16 @@ +#ifndef MYPAINTCONFIG_H +#define MYPAINTCONFIG_H + +#ifndef MYPAINT_TILE_SIZE +#define MYPAINT_TILE_SIZE 64 +#endif + +#ifndef MYPAINT_MAX_THREADS +#define MYPAINT_MAX_THREADS 16 +#endif + +#ifndef MYPAINT_MAX_MIPMAP_LEVEL +#define MYPAINT_MAX_MIPMAP_LEVEL 4 +#endif + +#endif /* MYPAINTCONFIG_H */ diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-fixed-tiled-surface.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-fixed-tiled-surface.h new file mode 100644 index 0000000..53445ff --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-fixed-tiled-surface.h @@ -0,0 +1,34 @@ +#ifndef MYPAINTFIXEDTILEDSURFACE_H +#define MYPAINTFIXEDTILEDSURFACE_H + +#include +#include +#include + +G_BEGIN_DECLS + +/** + * MyPaintFixedTiledSurface: + * + * Simple #MyPaintTiledSurface subclass that implements a fixed sized #MyPaintSurface. + * Only intended for testing and trivial use-cases, and to serve as an example of + * how to implement a tiled surface subclass. + */ +typedef struct MyPaintFixedTiledSurface MyPaintFixedTiledSurface; + +MyPaintFixedTiledSurface * +mypaint_fixed_tiled_surface_new(int width, int height); + +int +mypaint_fixed_tiled_surface_get_width(MyPaintFixedTiledSurface *self); + +int +mypaint_fixed_tiled_surface_get_height(MyPaintFixedTiledSurface *self); + + +MyPaintSurface * +mypaint_fixed_tiled_surface_interface(MyPaintFixedTiledSurface *self); + +G_END_DECLS + +#endif // MYPAINTFIXEDTILEDSURFACE_H diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-glib-compat.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-glib-compat.h new file mode 100644 index 0000000..bded620 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-glib-compat.h @@ -0,0 +1,32 @@ +#ifndef MYPAINTGLIBCOMPAT_H +#define MYPAINTGLIBCOMPAT_H + +#include + +#ifndef __G_LIB_H__ + +/* From $INCLUDEPATH/glib-2.0/glib/gmacros.h */ +#ifdef __cplusplus +# define G_BEGIN_DECLS extern "C" { +# define G_END_DECLS } +#else +# define G_BEGIN_DECLS +# define G_END_DECLS +#endif + +#define FALSE (0) +#define TRUE (!FALSE) + +typedef void * gpointer; + +/* From $INCLUDEPATH/glib-2.0/glib/gtypes.h */ +typedef char gchar; +typedef int gint; +typedef gint gboolean; + +/* From $LIBPATH/glib-2.0/include/glibconfig.h */ +typedef unsigned short guint16; + +#endif // __G_LIB_H__ + +#endif // MYPAINTGLIBCOMPAT_H diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-mapping.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-mapping.h new file mode 100644 index 0000000..a58e5d1 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-mapping.h @@ -0,0 +1,27 @@ +#ifndef MAPPING_H +#define MAPPING_H + +#include +#include + +G_BEGIN_DECLS + +typedef struct MyPaintMapping MyPaintMapping; + +MyPaintMapping * mypaint_mapping_new(int inputs_); +void mypaint_mapping_free(MyPaintMapping *self); +float mypaint_mapping_get_base_value(MyPaintMapping *self); +void mypaint_mapping_set_base_value(MyPaintMapping *self, float value); +void mypaint_mapping_set_n (MyPaintMapping * self, int input, int n); +int mypaint_mapping_get_n (MyPaintMapping * self, int input); +void mypaint_mapping_set_point (MyPaintMapping * self, int input, int index, float x, float y); +void mypaint_mapping_get_point (MyPaintMapping * self, int input, int index, float *x, float *y); +gboolean mypaint_mapping_is_constant(MyPaintMapping * self); +int mypaint_mapping_get_inputs_used_n(MyPaintMapping *self); +float mypaint_mapping_calculate (MyPaintMapping * self, float * data); +float mypaint_mapping_calculate_single_input (MyPaintMapping * self, float input); + + +G_END_DECLS + +#endif // MAPPING_H diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-rectangle.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-rectangle.h new file mode 100644 index 0000000..e08c68e --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-rectangle.h @@ -0,0 +1,39 @@ +#ifndef MYPAINTRECTANGLE_H +#define MYPAINTRECTANGLE_H + +/* libmypaint - The MyPaint Brush Library + * Copyright (C) 2008 Martin Renold + * Copyright (C) 2012 Jon Nordby + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +G_BEGIN_DECLS + +typedef struct { + int x; + int y; + int width; + int height; +} MyPaintRectangle; + +void mypaint_rectangle_expand_to_include_point(MyPaintRectangle *r, int x, int y); +MyPaintRectangle * +mypaint_rectangle_copy(MyPaintRectangle *self); + +G_END_DECLS + +#endif // MYPAINTRECTANGLE_H diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-surface.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-surface.h new file mode 100644 index 0000000..1217a76 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-surface.h @@ -0,0 +1,109 @@ +#ifndef MYPAINTSURFACE_H +#define MYPAINTSURFACE_H + +/* libmypaint - The MyPaint Brush Library + * Copyright (C) 2008 Martin Renold + * Copyright (C) 2012 Jon Nordby + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +G_BEGIN_DECLS + +typedef struct MyPaintSurface MyPaintSurface; + +typedef void (*MyPaintSurfaceGetColorFunction) (MyPaintSurface *self, + float x, float y, + float radius, + float * color_r, float * color_g, float * color_b, float * color_a + ); +typedef int (*MyPaintSurfaceDrawDabFunction) (MyPaintSurface *self, + float x, float y, + float radius, + float color_r, float color_g, float color_b, + float opaque, float hardness, + float alpha_eraser, + float aspect_ratio, float angle, + float lock_alpha, + float colorize); + +typedef void (*MyPaintSurfaceDestroyFunction) (MyPaintSurface *self); + +typedef void (*MyPaintSurfaceSavePngFunction) (MyPaintSurface *self, const char *path, int x, int y, int width, int height); + +typedef void (*MyPaintSurfaceBeginAtomicFunction) (MyPaintSurface *self); + +typedef void (*MyPaintSurfaceEndAtomicFunction) (MyPaintSurface *self, MyPaintRectangle *roi); + +/** + * MyPaintSurface: + * + * Abstract surface type for the MyPaint brush engine. The surface interface + * lets the brush engine specify dabs to render, and to pick color. + */ +struct MyPaintSurface { + MyPaintSurfaceDrawDabFunction draw_dab; + MyPaintSurfaceGetColorFunction get_color; + MyPaintSurfaceBeginAtomicFunction begin_atomic; + MyPaintSurfaceEndAtomicFunction end_atomic; + MyPaintSurfaceDestroyFunction destroy; + MyPaintSurfaceSavePngFunction save_png; + int refcount; +}; + +/** + * mypaint_surface_draw_dab: + * + * Draw a dab onto the surface. + */ +int +mypaint_surface_draw_dab(MyPaintSurface *self, + float x, float y, + float radius, + float color_r, float color_g, float color_b, + float opaque, float hardness, + float alpha_eraser, + float aspect_ratio, float angle, + float lock_alpha, + float colorize + ); + + +void +mypaint_surface_get_color(MyPaintSurface *self, + float x, float y, + float radius, + float * color_r, float * color_g, float * color_b, float * color_a + ); + +float +mypaint_surface_get_alpha (MyPaintSurface *self, float x, float y, float radius); + +void +mypaint_surface_save_png(MyPaintSurface *self, const char *path, int x, int y, int width, int height); + +void mypaint_surface_begin_atomic(MyPaintSurface *self); + +void mypaint_surface_end_atomic(MyPaintSurface *self, MyPaintRectangle *roi); + +void mypaint_surface_init(MyPaintSurface *self); +void mypaint_surface_ref(MyPaintSurface *self); +void mypaint_surface_unref(MyPaintSurface *self); + +G_END_DECLS + +#endif // MYPAINTSURFACE_H + diff --git a/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-tiled-surface.h b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-tiled-surface.h new file mode 100644 index 0000000..b225f7b --- /dev/null +++ b/thirdparty/libmypaint/dist/64/include/libmypaint/mypaint-tiled-surface.h @@ -0,0 +1,86 @@ +#ifndef MYPAINTTILEDSURFACE_H +#define MYPAINTTILEDSURFACE_H + +#include +#include +#include + +typedef enum { + MYPAINT_SYMMETRY_TYPE_VERTICAL, + MYPAINT_SYMMETRY_TYPE_HORIZONTAL, + MYPAINT_SYMMETRY_TYPE_VERTHORZ, + MYPAINT_SYMMETRY_TYPE_ROTATIONAL, + MYPAINT_SYMMETRY_TYPE_SNOWFLAKE, + MYPAINT_SYMMETRY_TYPES_COUNT +} MyPaintSymmetryType; + +G_BEGIN_DECLS + +typedef struct MyPaintTiledSurface MyPaintTiledSurface; + +typedef struct { + int tx; + int ty; + gboolean readonly; + guint16 *buffer; + gpointer context; /* Only to be used by the surface implemenations. */ + int thread_id; + int mipmap_level; +} MyPaintTileRequest; + +void +mypaint_tile_request_init(MyPaintTileRequest *data, int level, + int tx, int ty, gboolean readonly); + +typedef void (*MyPaintTileRequestStartFunction) (MyPaintTiledSurface *self, MyPaintTileRequest *request); +typedef void (*MyPaintTileRequestEndFunction) (MyPaintTiledSurface *self, MyPaintTileRequest *request); +typedef void (*MyPaintTiledSurfaceAreaChanged) (MyPaintTiledSurface *self, int bb_x, int bb_y, int bb_w, int bb_h); + +/** + * MyPaintTiledSurface: + * + * Interface and convenience class for implementing a #MyPaintSurface backed by a tile store. + * + * The size of the surface is infinite, and consumers need just implement two vfuncs. + */ +struct MyPaintTiledSurface { + MyPaintSurface parent; + /* private: */ + MyPaintTileRequestStartFunction tile_request_start; + MyPaintTileRequestEndFunction tile_request_end; + gboolean surface_do_symmetry; + MyPaintSymmetryType symmetry_type; + float surface_center_x; + float surface_center_y; + int rot_symmetry_lines; + struct OperationQueue *operation_queue; + MyPaintRectangle dirty_bbox; + gboolean threadsafe_tile_requests; + int tile_size; +}; + +void +mypaint_tiled_surface_init(MyPaintTiledSurface *self, + MyPaintTileRequestStartFunction tile_request_start, + MyPaintTileRequestEndFunction tile_request_end); + +void +mypaint_tiled_surface_destroy(MyPaintTiledSurface *self); + +void +mypaint_tiled_surface_set_symmetry_state(MyPaintTiledSurface *self, gboolean active, + float center_x, float center_y, + MyPaintSymmetryType symmetry_type, + int rot_symmetry_lines); +float +mypaint_tiled_surface_get_alpha (MyPaintTiledSurface *self, float x, float y, float radius); + +void mypaint_tiled_surface_tile_request_start(MyPaintTiledSurface *self, MyPaintTileRequest *request); +void mypaint_tiled_surface_tile_request_end(MyPaintTiledSurface *self, MyPaintTileRequest *request); + +void mypaint_tiled_surface_begin_atomic(MyPaintTiledSurface *self); +void mypaint_tiled_surface_end_atomic(MyPaintTiledSurface *self, MyPaintRectangle *roi); + +G_END_DECLS + +#endif // MYPAINTTILEDSURFACE_H diff --git a/thirdparty/libmypaint/dist/64/libiconv-2.dll b/thirdparty/libmypaint/dist/64/libiconv-2.dll new file mode 100755 index 0000000..9585920 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/libiconv-2.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4093b53b91565729564d539403aca91737ee094f902be60b6e261d78a67f0fae +size 1157325 diff --git a/thirdparty/libmypaint/dist/64/libintl-8.dll b/thirdparty/libmypaint/dist/64/libintl-8.dll new file mode 100755 index 0000000..3f7f8d6 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/libintl-8.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8eb37af030cff310ff94a43b68a16e0336af0828b62d1bd35e9e26bb2d2aad69 +size 404063 diff --git a/thirdparty/libmypaint/dist/64/libjson-c-2.dll b/thirdparty/libmypaint/dist/64/libjson-c-2.dll new file mode 100755 index 0000000..7af6fa0 --- /dev/null +++ b/thirdparty/libmypaint/dist/64/libjson-c-2.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d8e9efd3f204804c88f362d20b182e3c222a025b28a811b8dc3abf627f6fd36 +size 276980 diff --git a/thirdparty/libmypaint/dist/64/libmypaint-1-4-0.dll b/thirdparty/libmypaint/dist/64/libmypaint-1-4-0.dll new file mode 100755 index 0000000..9420a1a --- /dev/null +++ b/thirdparty/libmypaint/dist/64/libmypaint-1-4-0.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2747ff3cd4d107bcc7ddbd73099aac91b2b5bbcd69f1839f4d79418356d667b1 +size 392455 diff --git a/thirdparty/libmypaint/dist/64/libmypaint.lib b/thirdparty/libmypaint/dist/64/libmypaint.lib new file mode 100755 index 0000000..fac0dfa --- /dev/null +++ b/thirdparty/libmypaint/dist/64/libmypaint.lib @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:704fc5310b5a3f0b7b77ce530f39a04b0d1c07d0cdfe26dad79159cf01f4a2a6 +size 84848 diff --git a/thirdparty/libmypaint/download-all.sh b/thirdparty/libmypaint/download-all.sh new file mode 100755 index 0000000..fa95a15 --- /dev/null +++ b/thirdparty/libmypaint/download-all.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +set -e + +echo "" +echo "download" +echo "" + +mkdir -p download && cd download + +wget -c https://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.7.tar.gz +wget -c https://s3.amazonaws.com/json-c_releases/releases/json-c-0.12.1.tar.gz +wget -c https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz + +cd .. + +echo "" +echo "unpack" +echo "" + +mkdir -p src && cd src + +rm -rf gettext-0.19.7 +tar -xzf ../download/gettext-0.19.7.tar.gz +rm -rf json-c-0.12.1 +tar -xzf ../download/json-c-0.12.1.tar.gz +rm -rf libiconv-1.15 +tar -xzf ../download/libiconv-1.15.tar.gz + +echo "" +echo "checkout libmypaint" +echo "" + +BRANCH="testing" +if [ -d "libmypaint/.git" ]; then + cd libmypaint && git fetch && git reset --hard "origin/$BRANCH" && cd .. +else + git clone https://github.com/blackwarthog/libmypaint.git --branch $BRANCH +fi + +cd .. + +echo "" +echo "success" +echo "" diff --git a/thirdparty/libmypaint/license/gettext-0.19.7/gettext-runtime/intl/AUTHORS b/thirdparty/libmypaint/license/gettext-0.19.7/gettext-runtime/intl/AUTHORS new file mode 100644 index 0000000..ee09305 --- /dev/null +++ b/thirdparty/libmypaint/license/gettext-0.19.7/gettext-runtime/intl/AUTHORS @@ -0,0 +1 @@ +Ulrich Drepper diff --git a/thirdparty/libmypaint/license/gettext-0.19.7/gettext-runtime/intl/COPYING_LIB b/thirdparty/libmypaint/license/gettext-0.19.7/gettext-runtime/intl/COPYING_LIB new file mode 100644 index 0000000..c2c87d6 --- /dev/null +++ b/thirdparty/libmypaint/license/gettext-0.19.7/gettext-runtime/intl/COPYING_LIB @@ -0,0 +1,516 @@ + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. +^L + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. +^L + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. +^L + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. +^L + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. +^L + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. +^L + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. +^L + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS +^L + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA + +Also add information on how to contact you by electronic and paper +mail. + +You should also get your employer (if you work as a programmer) or +your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James +Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/thirdparty/libmypaint/license/json-c-0.12.1/AUTHORS b/thirdparty/libmypaint/license/json-c-0.12.1/AUTHORS new file mode 100644 index 0000000..b389989 --- /dev/null +++ b/thirdparty/libmypaint/license/json-c-0.12.1/AUTHORS @@ -0,0 +1,5 @@ +Michael Clark +Jehiah Czebotar +Eric Haszlakiewicz +C. Watford (christopher.watford@gmail.com) + diff --git a/thirdparty/libmypaint/license/json-c-0.12.1/COPYING b/thirdparty/libmypaint/license/json-c-0.12.1/COPYING new file mode 100644 index 0000000..740d125 --- /dev/null +++ b/thirdparty/libmypaint/license/json-c-0.12.1/COPYING @@ -0,0 +1,42 @@ + +Copyright (c) 2009-2012 Eric Haszlakiewicz + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------------------------------------------------------- + +Copyright (c) 2004, 2005 Metaparadigm Pte Ltd + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/thirdparty/libmypaint/license/libiconv-1.15/AUTHORS b/thirdparty/libmypaint/license/libiconv-1.15/AUTHORS new file mode 100644 index 0000000..8bedd79 --- /dev/null +++ b/thirdparty/libmypaint/license/libiconv-1.15/AUTHORS @@ -0,0 +1 @@ +Bruno Haible diff --git a/thirdparty/libmypaint/license/libiconv-1.15/COPYING_LIB b/thirdparty/libmypaint/license/libiconv-1.15/COPYING_LIB new file mode 100644 index 0000000..778d0bb --- /dev/null +++ b/thirdparty/libmypaint/license/libiconv-1.15/COPYING_LIB @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/thirdparty/libmypaint/license/libiconv-1.15/README b/thirdparty/libmypaint/license/libiconv-1.15/README new file mode 100644 index 0000000..19f8370 --- /dev/null +++ b/thirdparty/libmypaint/license/libiconv-1.15/README @@ -0,0 +1,172 @@ + GNU LIBICONV - character set conversion library + +This library provides an iconv() implementation, for use on systems which +don't have one, or whose implementation cannot convert from/to Unicode. + +It provides support for the encodings: + + European languages + ASCII, ISO-8859-{1,2,3,4,5,7,9,10,13,14,15,16}, + KOI8-R, KOI8-U, KOI8-RU, + CP{1250,1251,1252,1253,1254,1257}, CP{850,866,1131}, + Mac{Roman,CentralEurope,Iceland,Croatian,Romania}, + Mac{Cyrillic,Ukraine,Greek,Turkish}, + Macintosh + Semitic languages + ISO-8859-{6,8}, CP{1255,1256}, CP862, Mac{Hebrew,Arabic} + Japanese + EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP, ISO-2022-JP-2, ISO-2022-JP-1, + ISO-2022-JP-MS + Chinese + EUC-CN, HZ, GBK, CP936, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, + BIG5-HKSCS:2004, BIG5-HKSCS:2001, BIG5-HKSCS:1999, ISO-2022-CN, + ISO-2022-CN-EXT + Korean + EUC-KR, CP949, ISO-2022-KR, JOHAB + Armenian + ARMSCII-8 + Georgian + Georgian-Academy, Georgian-PS + Tajik + KOI8-T + Kazakh + PT154, RK1048 + Thai + ISO-8859-11, TIS-620, CP874, MacThai + Laotian + MuleLao-1, CP1133 + Vietnamese + VISCII, TCVN, CP1258 + Platform specifics + HP-ROMAN8, NEXTSTEP + Full Unicode + UTF-8 + UCS-2, UCS-2BE, UCS-2LE + UCS-4, UCS-4BE, UCS-4LE + UTF-16, UTF-16BE, UTF-16LE + UTF-32, UTF-32BE, UTF-32LE + UTF-7 + C99, JAVA + Full Unicode, in terms of 'uint16_t' or 'uint32_t' + (with machine dependent endianness and alignment) + UCS-2-INTERNAL, UCS-4-INTERNAL + Locale dependent, in terms of 'char' or 'wchar_t' + (with machine dependent endianness and alignment, and with OS and + locale dependent semantics) + char, wchar_t + The empty encoding name "" is equivalent to "char": it denotes the + locale dependent character encoding. + +When configured with the option --enable-extra-encodings, it also provides +support for a few extra encodings: + + European languages + CP{437,737,775,852,853,855,857,858,860,861,863,865,869,1125} + Semitic languages + CP864 + Japanese + EUC-JISX0213, Shift_JISX0213, ISO-2022-JP-3 + Chinese + BIG5-2003 (experimental) + Turkmen + TDS565 + Platform specifics + ATARIST, RISCOS-LATIN1 + +It can convert from any of these encodings to any other, through Unicode +conversion. + +It has also some limited support for transliteration, i.e. when a character +cannot be represented in the target character set, it can be approximated +through one or several similarly looking characters. Transliteration is +activated when "//TRANSLIT" is appended to the target encoding name. + +libiconv is for you if your application needs to support multiple character +encodings, but that support lacks from your system. + + +Installation +------------ + +As usual for GNU packages: + + $ ./configure --prefix=/usr/local + $ make + $ make install + +After installing GNU libiconv for the first time, it is recommended to +recompile and reinstall GNU gettext, so that it can take advantage of +libiconv. + +On systems other than GNU/Linux, the iconv program will be internationalized +only if GNU gettext has been built and installed before GNU libiconv. This +means that the first time GNU libiconv is installed, we have a circular +dependency between the GNU libiconv and GNU gettext packages, which can be +resolved by building and installing either + - first libiconv, then gettext, then libiconv again, +or (on systems supporting shared libraries, excluding AIX) + - first gettext, then libiconv, then gettext again. +Recall that before building a package for the second time, you need to erase +the traces of the first build by running "make distclean". + +This library can be built and installed in two variants: + + - The library mode. This works on all systems, and uses a library + 'libiconv.so' and a header file ''. (Both are installed + through "make install".) + + To use it, simply #include and use the functions. + + To use it in an autoconfiguring package: + - If you don't use automake, append m4/iconv.m4 to your aclocal.m4 + file. + - If you do use automake, add m4/iconv.m4 to your m4 macro repository. + - Add to the link command line of libraries and executables that use + the functions the placeholder @LIBICONV@ (or, if using libtool for + the link, @LTLIBICONV@). If you use automake, the right place for + these additions are the *_LDADD variables. + Note that 'iconv.m4' is also part of the GNU gettext package, which + installs it in /usr/local/share/aclocal/iconv.m4. + + - The libc plug/override mode. This works on GNU/Linux, Solaris and OSF/1 + systems only. It is a way to get good iconv support without having + glibc-2.1. + It installs a library 'preloadable_libiconv.so'. This library can be used + with LD_PRELOAD, to override the iconv* functions present in the C library. + + On GNU/Linux and Solaris: + $ export LD_PRELOAD=/usr/local/lib/preloadable_libiconv.so + + On OSF/1: + $ export _RLD_LIST=/usr/local/lib/preloadable_libiconv.so:DEFAULT + + A program's source need not be modified, the program need not even be + recompiled. Just set the LD_PRELOAD environment variable, that's it! + + +Copyright +--------- + +The libiconv and libcharset _libraries_ and their header files are under LGPL, +see file COPYING.LIB. + +The iconv _program_ and the documentation are under GPL, see file COPYING. + + +Download +-------- + + http://ftp.gnu.org/gnu/libiconv/libiconv-1.15.tar.gz + +Homepage +-------- + + http://www.gnu.org/software/libiconv/ + +Bug reports to +-------------- + + + + +Bruno Haible diff --git a/thirdparty/libmypaint/license/libmypaint/COPYING b/thirdparty/libmypaint/license/libmypaint/COPYING new file mode 100644 index 0000000..542c9a6 --- /dev/null +++ b/thirdparty/libmypaint/license/libmypaint/COPYING @@ -0,0 +1,14 @@ +libmypaint - The MyPaint Brush Library +Copyright (C) 2008-2011 Martin Renold and contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/thirdparty/libmypaint/mingw-vars.sh b/thirdparty/libmypaint/mingw-vars.sh new file mode 100644 index 0000000..2903331 --- /dev/null +++ b/thirdparty/libmypaint/mingw-vars.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +set -e + +[ ! -z "$HOST" ] || (echo "host was not set" && false) + +mkdir -p "$INST_DIR" +mkdir -p "$DIST_DIR" +export PREFIX="$INST_DIR" + +EXTRA_CPP_OPTIONS= + +export PATH="/usr/$HOST/bin:/usr/$HOST/sys-root/mingw/bin:$PATH" +export LD_LIBRARY_PATH="/usr/$HOST/sys-root/mingw/lib:$LD_LIBRARY_PATH" + +export ADDR2LINE=/usr/bin/$HOST-addr2line +export AS=/usr/bin/$HOST-as +export AR=/usr/bin/$HOST-ar +export CC=/usr/bin/$HOST-gcc +export CXXFILT=/usr/bin/$HOST-c++filt +export CXX=/usr/bin/$HOST-c++ +export CPP=/usr/bin/$HOST-cpp +export DLLTOOL=/usr/bin/$HOST-dlltool +export DLLWRAP=/usr/bin/$HOST-dllwrap +export ELFEDIT=/usr/bin/$HOST-elfedit +export FORTRAN=/usr/bin/$HOST-gfortran +export GXX=/usr/bin/$HOST-g++ +export GCC=/usr/bin/$HOST-gcc +export GCOV=/usr/bin/$HOST-gcov +export GCOV_TOOL=/usr/bin/$HOST-gcov-tool +export GFORTRAN=/usr/bin/$HOST-gfortran +export GPROF=/usr/bin/$HOST-gprof +export LD=/usr/bin/$HOST-ld +export LD_BFD=/usr/bin/$HOST-ld.bfd +export NM=/usr/bin/$HOST-nm +export OBJCOPY=/usr/bin/$HOST-objcopy +export OBJDUMP=/usr/bin/$HOST-objdump +export PKG_CONFIG=/usr/bin/$HOST-pkg-config +export RANLIB=/usr/bin/$HOST-ranlib +export READELF=/usr/bin/$HOST-readelf +export SIZE=/usr/bin/$HOST-size +export STRINGS=/usr/bin/$HOST-strings +export STRIP=/usr/bin/$HOST-strip +export WINDMC=/usr/bin/$HOST-windmc +export RC=/usr/bin/$HOST-windres +export WINDRES=/usr/bin/$HOST-windres + +export LDFLAGS=" -L/usr/$HOST/sys-root/mingw/lib $LDFLAGS" +export CFLAGS=" $EXTRA_CPP_OPTIONS $CFLAGS" +export CPPFLAGS=" $EXTRA_CPP_OPTIONS $CPPFLAGS" +export CXXFLAGS=" $EXTRA_CPP_OPTIONS $CXXFLAGS" +export PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/$HOST/sys-root/mingw/lib/pkgconfig" +export PKG_CONFIG_LIBDIR="/usr/$HOST/sys-root/mingw/lib" +export XDG_DATA_DIRS="$XDG_DATA_DIRS" +export CMAKE_INCLUDE_PATH="$CMAKE_INCLUDE_PATH" +export CMAKE_LIBRARY_PATH="/usr/$HOST/sys-root/mingw/lib:$CMAKE_LIBRARY_PATH" + +unset EXTRA_CPP_OPTIONS + + +export PATH="$PREFIX/bin:$PATH" +export LD_LIBRARY_PATH="$PREFIX/lib:$LD_LIBRARY_PATH" +export LDFLAGS="-L$PREFIX/lib $LDFLAGS" +export CFLAGS="-I$PREFIX/include $CFLAGS" +export CPPFLAGS="-I$PREFIX/include $CPPFLAGS" +export CXXFLAGS="-I$PREFIX/include $CXXFLAGS" +export PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig:$PREFIX/share/pkgconfig:$PKG_CONFIG_PATH" +export PKG_CONFIG_LIBDIR="$PREFIX/lib:$PKG_CONFIG_LIBDIR" +export PKG_CONFIG_SYSROOT_DIR="/" +export XDG_DATA_DIRS="$PREFIX/share:$XDG_DATA_DIRS" +#export ACLOCAL_PATH="$PREFIX/share/aclocal:$ACLOCAL_PATH" +export CMAKE_INCLUDE_PATH="$PREFIX/include:$CMAKE_INCLUDE_PATH" +export CMAKE_LIBRARY_PATH="$PREFIX/lib:$CMAKE_LIBRARY_PATH" diff --git a/thirdparty/libmypaint/script-gettext.sh b/thirdparty/libmypaint/script-gettext.sh new file mode 100755 index 0000000..d758112 --- /dev/null +++ b/thirdparty/libmypaint/script-gettext.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +set -e +[ ! -z "$SRC_DIR" ] || (echo "env was not set" && false) + +NAME="gettext-0.19.7" +cp --remove-destination -rup "$SRC_DIR/$NAME" "$BUILD_DIR/" +cd "$BUILD_DIR/$NAME" + +export CFLAGS="-O2 $CFLAGS" +export CXXFLAGS="-O2 $CXXFLAGS" + +./configure \ + --host="$HOST" \ + --prefix="$PREFIX" \ + --with-libiconv-prefix="$PREFIX" \ + --disable-java \ + --disable-native-java \ + --disable-csharp \ + --enable-static \ + --enable-threads=win32 \ + --without-emacs \ + --disable-openmp \ + --enable-shared \ + --disable-static +make -j8 +make install + +echo "" +echo "success" +echo "" diff --git a/thirdparty/libmypaint/script-iconv.sh b/thirdparty/libmypaint/script-iconv.sh new file mode 100755 index 0000000..b83fc79 --- /dev/null +++ b/thirdparty/libmypaint/script-iconv.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -e +[ ! -z "$SRC_DIR" ] || (echo "env was not set" && false) + +NAME="libiconv-1.15" +cp --remove-destination -rup "$SRC_DIR/$NAME" "$BUILD_DIR/" +cd "$BUILD_DIR/$NAME" + +./configure --host="$HOST" --prefix="$PREFIX" --enable-shared --disable-static +make -j8 +make install + +echo "" +echo "success" +echo "" diff --git a/thirdparty/libmypaint/script-json-c.sh b/thirdparty/libmypaint/script-json-c.sh new file mode 100755 index 0000000..581833e --- /dev/null +++ b/thirdparty/libmypaint/script-json-c.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +set -e +[ ! -z "$SRC_DIR" ] || (echo "env was not set" && false) + +NAME="json-c-0.12.1" +cp --remove-destination -rup "$SRC_DIR/$NAME" "$BUILD_DIR/" +cd "$BUILD_DIR/$NAME" +set -e + +export CFLAGS="-Wno-error=unknown-pragmas $CFLAGS" +export LIBS="-ladvapi32 -lintl" + +./configure --host="$HOST" --prefix="$PREFIX" --enable-shared --disable-static +make || true +echo "#undef malloc" >> config.h +echo "#undef realloc" >> config.h +make -j8 +make install + +echo "" +echo "success" +echo "" diff --git a/thirdparty/libmypaint/script-libmypaint.sh b/thirdparty/libmypaint/script-libmypaint.sh new file mode 100755 index 0000000..2fa7df4 --- /dev/null +++ b/thirdparty/libmypaint/script-libmypaint.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -e +[ ! -z "$SRC_DIR" ] || (echo "env was not set" && false) + +NAME="libmypaint" +cp --remove-destination -rup "$SRC_DIR/$NAME" "$BUILD_DIR/" +cd "$BUILD_DIR/$NAME" + +./autogen.sh +./configure --host="$HOST" --prefix="$PREFIX" --enable-shared --enable-static +make clean +make -j8 +make install + +cp "$INST_DIR/bin/"libiconv*.dll "$DIST_DIR/" +cp "$INST_DIR/bin/"libintl*.dll "$DIST_DIR/" +cp "$INST_DIR/bin/"libjson-c*.dll "$DIST_DIR/" + +cp "$INST_DIR/bin/"libmypaint*.dll "$DIST_DIR/" +cp "$INST_DIR/lib/"libmypaint*.dll.a "$DIST_DIR/libmypaint.lib" +mkdir -p "$DIST_DIR/include" +cp -r "$INST_DIR/include/libmypaint" "$DIST_DIR/include/" + +echo "" +echo "success" +echo "" diff --git a/thirdparty/libmypaint/script-shell.sh b/thirdparty/libmypaint/script-shell.sh new file mode 100755 index 0000000..2df709a --- /dev/null +++ b/thirdparty/libmypaint/script-shell.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +set -e +[ ! -z "$SRC_DIR" ] || (echo "env was not set" && false) + +/bin/bash \ No newline at end of file diff --git a/toonz/install/SystemVar.ini b/toonz/install/SystemVar.ini index a843174..c644e4f 100644 --- a/toonz/install/SystemVar.ini +++ b/toonz/install/SystemVar.ini @@ -8,4 +8,4 @@ OpenToonzPROFILES="/Applications/OpenToonz/OpenToonz_1.1_stuff/profiles" TOONZPROJECTS="/Applications/OpenToonz/OpenToonz_1.1_stuff/projects" TOONZROOT="/Applications/OpenToonz/OpenToonz_1.1_stuff" OPENTOONZROOT="/Applications/OpenToonz/OpenToonz_1.1_stuff" -TOONZSTUDIOPALETTE="/Applications/OpenToonz/OpenToonz_1.1_stuff/projects/studiopalette" +TOONZSTUDIOPALETTE="/Applications/OpenToonz/OpenToonz_1.1_stuff/studiopalette" diff --git a/toonz/sources/CMakeLists.txt b/toonz/sources/CMakeLists.txt index 71679b5..a3082a4 100644 --- a/toonz/sources/CMakeLists.txt +++ b/toonz/sources/CMakeLists.txt @@ -329,6 +329,8 @@ if(BUILD_ENV_MSVC) if(PLATFORM EQUAL 32) set(QT_LIB ${SDKROOT}/quicktime/QT73SDK/Libraries/QTMLClient.lib) endif() + set(MYPAINT_LIB_INCLUDE_DIRS ${SDKROOT}/libmypaint/dist/${PLATFORM}/include/libmypaint) + set(MYPAINT_LIB_LDFLAGS ${SDKROOT}/libmypaint/dist/${PLATFORM}/libmypaint.lib) elseif(BUILD_ENV_APPLE) find_library(GLUT_LIB GLUT) find_library(GL_LIB OpenGL) @@ -376,6 +378,7 @@ elseif(BUILD_ENV_APPLE) find_package(LZO REQUIRED) message("LZO:" ${LZO_INCLUDE_DIR}) + pkg_check_modules(MYPAINT_LIB REQUIRED libmypaint) elseif(BUILD_ENV_UNIXLIKE) if(BUILD_TARGET_WIN) if(PLATFORM EQUAL 32) @@ -438,6 +441,7 @@ elseif(BUILD_ENV_UNIXLIKE) pkg_check_modules(FREETYPE REQUIRED freetype2) pkg_check_modules(SDL_LIB REQUIRED sdl2) endif() + pkg_check_modules(MYPAINT_LIB REQUIRED libmypaint) endif() @@ -501,6 +505,7 @@ include_directories( ${USB_LIB_INCLUDE_DIRS} ${SUPERLU_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} + ${MYPAINT_LIB_INCLUDE_DIRS} ) if(BUILD_TARGET_WIN AND PLATFORM EQUAL 64) diff --git a/toonz/sources/common/tapptools/tcli.cpp b/toonz/sources/common/tapptools/tcli.cpp index 3f5f2da..d3ee46d 100644 --- a/toonz/sources/common/tapptools/tcli.cpp +++ b/toonz/sources/common/tapptools/tcli.cpp @@ -4,6 +4,9 @@ #include "tconvert.h" #include +#include "tversion.h" +using namespace TVER; + using namespace std; using namespace TCli; @@ -16,11 +19,17 @@ namespace { //--------------------------------------------------------- -void printToonzRelease(ostream &out) { out << "Toonz 7.1" << endl; } +void printToonzRelease(ostream &out) { + TVER::ToonzVersion tver; + out << tver.getAppVersionInfo("") << endl; +} //--------------------------------------------------------- -void printLibRelease(ostream &out) { out << "Tnzcore 1.0 - " __DATE__ << endl; } +void printLibRelease(ostream &out) { + TVER::ToonzVersion tver; + out << tver.getAppVersionInfo("") << " - " __DATE__ << endl; +} //--------------------------------------------------------- } // namespace @@ -50,6 +59,7 @@ static SpecialUsageElement bra("["); static SpecialUsageElement ket("]"); static Switcher help("-help", "Print this help page"); static Switcher release("-release", "Print the current Toonz version"); +static Switcher version("-version", "Print the current Toonz version"); static Switcher libRelease("-librelease", ""); // hidden: print the lib version @@ -261,7 +271,7 @@ UsageLine TCli::operator+(const UsageLine &a, const Optional &b) { Optional::Optional(const UsageLine &ul) : UsageLine(ul.getCount() + 2) { m_elements[0] = &bra; m_elements[m_count - 1] = &ket; - for (int i = 0; i < ul.getCount(); i++) m_elements[i + 1] = ul[i]; + for (int i = 0; i < ul.getCount(); i++) m_elements[i + 1]= ul[i]; } //========================================================= @@ -329,6 +339,7 @@ UsageImp::UsageImp(string progName) void UsageImp::addStandardUsages() { add(help); add(release); + add(version); add(libRelease); } @@ -700,7 +711,7 @@ bool Usage::parse(int argc, char *argv[], std::ostream &err) { print(err); return false; } - if (release) { + if (release || version) { printToonzRelease(err); return false; } diff --git a/toonz/sources/common/tcore/tstring.cpp b/toonz/sources/common/tcore/tstring.cpp index b8754c2..743db4b 100644 --- a/toonz/sources/common/tcore/tstring.cpp +++ b/toonz/sources/common/tcore/tstring.cpp @@ -58,7 +58,7 @@ std::string to_string(std::wstring ws) { #endif } -std::string to_string(const TFilePath &fp) { +std::string to_string(const TFilePath& fp) { return ::to_string(fp.getWideString()); } @@ -80,7 +80,7 @@ std::string to_string(double value, int prec) { return out.str(); } -std::string to_string(void *p) { +std::string to_string(void* p) { std::ostringstream out; out << p; return out.str(); @@ -125,9 +125,12 @@ bool isDouble(std::wstring s) { return isDouble(::to_string(s)); } std::string toUpper(std::string a) { #ifdef _WIN32 - return _strupr(const_cast(a.c_str())); + size_t size = a.size(); + const char* cstr = a.c_str(); + std::vector buf(cstr, cstr + size + 1); + return _strupr(&buf[0]); #else - std::string ret = a; + std::string ret(a); for (int i = 0; i < (int)ret.length(); i++) ret[i] = toupper(ret[i]); return ret; #endif @@ -135,9 +138,12 @@ std::string toUpper(std::string a) { std::string toLower(std::string a) { #ifdef _WIN32 - return _strlwr(const_cast(a.c_str())); + size_t size = a.size(); + const char* cstr = a.c_str(); + std::vector buf(cstr, cstr + size + 1); + return _strlwr(&buf[0]); #else - std::string ret = a; + std::string ret(a); for (int i = 0; i < (int)ret.length(); i++) ret[i] = tolower(ret[i]); return ret; #endif @@ -145,27 +151,26 @@ std::string toLower(std::string a) { std::wstring toUpper(std::wstring a) { #ifdef _WIN32 - return _wcsupr(const_cast(a.c_str())); + size_t size = a.size(); + const wchar_t* cstr = a.c_str(); + std::vector buf(cstr, cstr + size + 1); + return _wcsupr(&buf[0]); #else - std::wstring ret; - for (int i = 0; i < (int)a.length(); i++) { - wchar_t c = towupper(a[i]); - ret += c; - } + std::wstring ret(a); + for (int i = 0; i < (int)ret.length(); i++) ret[i] = towupper(ret[i]); return ret; #endif } std::wstring toLower(std::wstring a) { #ifdef _WIN32 - return _wcslwr(const_cast(a.c_str())); + size_t size = a.size(); + const wchar_t* cstr = a.c_str(); + std::vector buf(cstr, cstr + size + 1); + return _wcslwr(&buf[0]); #else - const int length = (int)a.length(); - std::wstring ret; - ret.resize(length); - for (int i = 0; i < length; i++) { - ret[i] = towlower(a[i]); - } + std::wstring ret(a); + for (int i = 0; i < (int)ret.length(); i++) ret[i] = towlower(ret[i]); return ret; #endif } diff --git a/toonz/sources/common/trop/trop_borders.cpp b/toonz/sources/common/trop/trop_borders.cpp index ac39021..44a03e3 100644 --- a/toonz/sources/common/trop/trop_borders.cpp +++ b/toonz/sources/common/trop/trop_borders.cpp @@ -58,18 +58,18 @@ namespace borders { // Standard type instantiations -template void DVAPI readMeshes( - const TRasterPT &raster, ImageMeshesReaderT &reader); -template void DVAPI readMeshes( - const TRasterPT &raster, ImageMeshesReaderT &reader); +template void DVAPI readMeshes(const TRasterPT &raster, + ImageMeshesReaderT &reader); +template void DVAPI readMeshes(const TRasterPT &raster, + ImageMeshesReaderT &reader); template void DVAPI readMeshes( const TRasterPT &raster, ImageMeshesReaderT &reader); -template void DVAPI readMeshes( - const TRasterPT &raster, - ImageMeshesReaderT &reader); -template void DVAPI readMeshes( - const TRasterPT &raster, - ImageMeshesReaderT &reader); +template void DVAPI +readMeshes(const TRasterPT &raster, + ImageMeshesReaderT &reader); +template void DVAPI +readMeshes(const TRasterPT &raster, + ImageMeshesReaderT &reader); //-------------------------------------------------------------------------------- @@ -323,6 +323,5 @@ void readMeshes(const TRasterPT &raster, ImageMeshesReaderT &reader) { raster, reader.pixelSelector(), reader); raster->unlock(); } - } } // namespace TRop::borders diff --git a/toonz/sources/common/tsound/tsound_nt.cpp b/toonz/sources/common/tsound/tsound_nt.cpp index 94a18e3..2ff35fa 100644 --- a/toonz/sources/common/tsound/tsound_nt.cpp +++ b/toonz/sources/common/tsound/tsound_nt.cpp @@ -139,7 +139,7 @@ private: //============================================================================== static WAVEHDR *prepareWaveHeader(HWAVEOUT wout, const TSoundTrackP &subTrack, - ULONG &count) { + ULONG &count) { WAVEHDR *whdr = new WAVEHDR; memset(whdr, 0, sizeof(WAVEHDR)); whdr->dwBufferLength = subTrack->getSampleSize() * subTrack->getSampleCount(); diff --git a/toonz/sources/common/tvrender/qtofflinegl.cpp b/toonz/sources/common/tvrender/qtofflinegl.cpp index bc434e5..b11b351 100644 --- a/toonz/sources/common/tvrender/qtofflinegl.cpp +++ b/toonz/sources/common/tvrender/qtofflinegl.cpp @@ -6,7 +6,7 @@ //----------------------------------------------------------------------------- -#if 0 // was _WIN32, this function not used +#if 0 // was _WIN32, this function not used static void swapRedBlueChannels( void *buffer, diff --git a/toonz/sources/common/twain/ttwain_win.c b/toonz/sources/common/twain/ttwain_win.c index ec59606..6277439 100644 --- a/toonz/sources/common/twain/ttwain_win.c +++ b/toonz/sources/common/twain/ttwain_win.c @@ -13,9 +13,9 @@ int TTWAIN_EnableWindow(void *hwnd, int flag) { return TTWAIN_EnableWindowPD(hwnd, flag); } -//static void TTWAIN_EmptyMessageQueue(void) { TTWAIN_EmptyMessageQueuePD(); } +// static void TTWAIN_EmptyMessageQueue(void) { TTWAIN_EmptyMessageQueuePD(); } -//static void TTWAIN_ModalEventLoop(void) { TTWAIN_ModalEventLoopPD(); } +// static void TTWAIN_ModalEventLoop(void) { TTWAIN_ModalEventLoopPD(); } #ifdef __cplusplus } diff --git a/toonz/sources/image/avi/tiio_avi.cpp b/toonz/sources/image/avi/tiio_avi.cpp index a43f423..04bcd67 100644 --- a/toonz/sources/image/avi/tiio_avi.cpp +++ b/toonz/sources/image/avi/tiio_avi.cpp @@ -1061,9 +1061,11 @@ LRESULT safe_ICClose(HIC hic) { } #ifdef _MSC_VER - typedef std::unique_ptr, decltype(&safe_ICClose)> hic_t; +typedef std::unique_ptr, decltype(&safe_ICClose)> + hic_t; #else - typedef std::unique_ptr::type, decltype(&safe_ICClose)> hic_t; +typedef std::unique_ptr::type, decltype(&safe_ICClose)> + hic_t; #endif hic_t safe_ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode) { diff --git a/toonz/sources/image/sprite/tiio_sprite.cpp b/toonz/sources/image/sprite/tiio_sprite.cpp index c52dfe6..4c5e6f8 100644 --- a/toonz/sources/image/sprite/tiio_sprite.cpp +++ b/toonz/sources/image/sprite/tiio_sprite.cpp @@ -101,14 +101,16 @@ TLevelWriterSprite::~TLevelWriterSprite() { int spriteSheetWidth; int spriteSheetHeight; if (m_format == "Grid") { + // Calculate Grid Size while (horizDim * horizDim < m_imagesResized.size()) horizDim++; totalHorizPadding = horizDim * horizPadding; spriteSheetWidth = horizDim * resizedWidth + totalHorizPadding; vertDim = horizDim; + // Figure out if there is one row too many (Such as 6 images needs 3 x 2 grid) if (vertDim * vertDim - vertDim >= m_imagesResized.size()) { vertDim = vertDim - 1; - totalVertPadding = vertDim * vertPadding; } + totalVertPadding = vertDim * vertPadding; spriteSheetHeight = vertDim * resizedHeight + totalVertPadding; } else if (m_format == "Vertical") { spriteSheetWidth = resizedWidth + horizPadding; @@ -117,7 +119,6 @@ TLevelWriterSprite::~TLevelWriterSprite() { } else if (m_format == "Horizontal") { spriteSheetWidth = m_imagesResized.size() * (resizedWidth + horizPadding); spriteSheetHeight = resizedHeight + vertPadding; - ; horizDim = m_imagesResized.size(); } diff --git a/toonz/sources/image/tif/tiio_tif.cpp b/toonz/sources/image/tif/tiio_tif.cpp index 2f7086b..ba999ec 100644 --- a/toonz/sources/image/tif/tiio_tif.cpp +++ b/toonz/sources/image/tif/tiio_tif.cpp @@ -102,6 +102,8 @@ void TifReader::open(FILE *file) { int fd = fileno(file); #if 0 m_tiff = TIFFFdOpenNoCloseProc(fd, "", "rb"); +#elif defined(_WIN32) && defined(__GNUC__) + m_tiff = TIFFFdOpen((int)_get_osfhandle(dup(fd)), "", "rb"); #else m_tiff = TIFFFdOpen(dup(fd), "", "rb"); #endif @@ -792,6 +794,8 @@ void TifWriter::open(FILE *file, const TImageInfo &info) { int fd = fileno(file); #if 0 m_tiff = TIFFFdOpenNoCloseProc(fd, "", mode.c_str()); +#elif defined(_WIN32) && defined(__GNUC__) + m_tiff = TIFFFdOpen((int)_get_osfhandle(dup(fd)), "", mode.c_str()); #else m_tiff = TIFFFdOpen(dup(fd), "", mode.c_str()); #endif diff --git a/toonz/sources/include/cellposition.h b/toonz/sources/include/cellposition.h new file mode 100644 index 0000000..e510d10 --- /dev/null +++ b/toonz/sources/include/cellposition.h @@ -0,0 +1,58 @@ +#pragma once + +#ifndef CELL_POSITION_INCLUDED +#define CELL_POSITION_INCLUDED + +#include + +using std::min; +using std::max; + +// Identifies cells by frame and layer rather than row and column +class CellPosition { + int _frame; // a frame number. corresponds to row in vertical xsheet + int _layer; // a layer number. corresponds to col in vertical xsheet + +public: + CellPosition() : _frame(0), _layer(0) {} + CellPosition(int frame, int layer) : _frame(frame), _layer(layer) {} + + int frame() const { return _frame; } + int layer() const { return _layer; } + + void setFrame(int frame) { _frame = frame; } + void setLayer(int layer) { _layer = layer; } + + CellPosition &operator=(const CellPosition &that) = default; + + operator bool() const { return _frame || _layer; } + + CellPosition operator+(const CellPosition &add) { + return CellPosition(_frame + add._frame, _layer + add._layer); + } + CellPosition operator*(const CellPosition &mult) { + return CellPosition(_frame * mult._frame, _layer * mult._layer); + } + void ensureValid() { + if (_frame < 0) _frame = 0; + if (_layer < 0) _layer = 0; + } +}; + +// A square range identified by two corners +class CellRange { + CellPosition _from, _to; // from.frame <= to.frame && from.layer <= to.layer + +public: + CellRange() {} + CellRange(const CellPosition &from, const CellPosition &to) + : _from(min(from.frame(), to.frame()), min(from.layer(), to.layer())) + , _to(max(from.frame(), to.frame()), max(from.layer(), to.layer())) {} + + const CellPosition &from() const { return _from; } + const CellPosition &to() const { return _to; } + + CellRange &operator=(const CellRange &that) = default; +}; + +#endif diff --git a/toonz/sources/include/ext/plasticskeleton.h b/toonz/sources/include/ext/plasticskeleton.h index 2e95de8..e622e5d 100644 --- a/toonz/sources/include/ext/plasticskeleton.h +++ b/toonz/sources/include/ext/plasticskeleton.h @@ -8,8 +8,8 @@ // TnzCore includes #include "tsmartpointer.h" #include "tpersist.h" -#include "tmeshimage.h" // add imported template - // instance tcg::Vertex (for Windows dll) +#include "tmeshimage.h" // add imported template + // instance tcg::Vertex (for Windows dll) // TnzExt includes #include "plastichandle.h" diff --git a/toonz/sources/include/orientation.h b/toonz/sources/include/orientation.h new file mode 100644 index 0000000..d40c949 --- /dev/null +++ b/toonz/sources/include/orientation.h @@ -0,0 +1,243 @@ +#pragma once + +#ifndef ORIENTATION_INCLUDED +#define ORIENTATION_INCLUDED + +#undef DVAPI +#undef DVVAR +#ifdef TOONZLIB_EXPORTS +#define DVAPI DV_EXPORT_API +#define DVVAR DV_EXPORT_VAR +#else +#define DVAPI DV_IMPORT_API +#define DVVAR DV_IMPORT_VAR +#endif + +#include "tcommon.h" +#include "cellposition.h" +#include "toonz/cellpositionratio.h" +#include +#include +#include +#include +#include +#include + +using std::vector; +using std::map; + +// Defines timeline direction: top to bottom; left to right. +// old (vertical timeline) = new (universal) = old (kept) +// x = layer axis = column +// y = frame axis = row + +// A pair of numbers +class DVAPI NumberRange { + int _from, _to; // _from <= _to + + NumberRange() : _from(0), _to(0) {} + +public: + NumberRange(int from, int to) : _from(min(from, to)), _to(max(from, to)) {} + + int from() const { return _from; } + int to() const { return _to; } + + int length() const { return _to - _from; } + int middle() const { return (_to + _from) / 2; } + int weight(double toWeight) const; + double ratio(int at) const; + + NumberRange adjusted(int addFrom, int addTo) const; +}; + +class ColumnFan; +class QPixmap; +class QPainterPath; + +//! lists predefined rectangle sizes and positions (relative to top left corner +//! of a cell) +enum class PredefinedRect { + CELL, //! size of a cell + DRAG_HANDLE_CORNER, //! area for dragging a cell + KEY_ICON, //! position of key icon + CELL_NAME, //! cell name box + CELL_NAME_WITH_KEYFRAME, //! cell name box when keyframe is displayed + END_EXTENDER, //! bottom / right extender + BEGIN_EXTENDER, //! top / left extender + KEYFRAME_AREA, //! part of cell dedicated to key frames + DRAG_AREA, //! draggable side bar + SOUND_TRACK, //! area dedicated to waveform display + PREVIEW_TRACK, //! sound preview area + BEGIN_SOUND_EDIT, //! top sound resize + END_SOUND_EDIT, //! bottom sound resize + NOTE_AREA, //! size of top left note controls + NOTE_ICON, //! size of note icons that appear in cells area + FRAME_LABEL, //! area for writing frame number + FRAME_HEADER, + LAYER_HEADER, + FOLDED_LAYER_HEADER, //! size of layer header when it is folded + PLAY_RANGE, //! area for play range marker within frame header + ONION, //! onion handle placement + ONION_DOT, //! moveable dot placement + ONION_DOT_FIXED, //! fixed dot placement + ONION_AREA, //! area where mouse events will alter onion + ONION_FIXED_DOT_AREA, + ONION_DOT_AREA, + PINNED_CENTER_KEY, //! displays a small blue number + RENAME_COLUMN, //! where column rename control appears after clicking + EYE_AREA, //! clickable area larger than the eye, containing it + EYE, //! the eye itself + PREVIEW_LAYER_AREA, //! clickable area larger than preview icon, containing + //! it + PREVIEW_LAYER, + LOCK_AREA, //! clickable area larger than lock icon, containing it + LOCK, //! the lock icon itself + DRAG_LAYER, //! draggable area in layer header + LAYER_NAME, //! where to display column name. clicking will rename + LAYER_NUMBER, //! where to display column number. + SOUND_ICON, + VOLUME_TRACK, //! area where track is displayed + VOLUME_AREA, //! active area for volume control + LOOP_ICON, //! area for repeat animation icon + LAYER_HEADER_PANEL, //! panel displaying headers for the layer rows in + //! timeline mode + THUMBNAIL_AREA, //! area for header thumbnails and other icons + THUMBNAIL, //! the actual thumbnail, if there is one + PEGBAR_NAME, //! where to display pegbar name + PARENT_HANDLE_NAME, //! where to display parent handle number + FILTER_COLOR //! where to show layer's filter color +}; +enum class PredefinedLine { + LOCKED, //! dotted vertical line when cell is locked + SEE_MARKER_THROUGH, //! horizontal marker visible through drag handle + CONTINUE_LEVEL, //! level with the same name represented by vertical line + CONTINUE_LEVEL_WITH_NAME, //! adjusted when level name is on each marker + EXTENDER_LINE //! see grid through extender handle +}; +enum class PredefinedDimension { + LAYER, //! width of a layer column / height of layer row + FRAME, //! height of frame row / width of frame column + INDEX, //! index of this orientation in the array of all + SOUND_AMPLITUDE, //! amplitude of sound track, in pixels + FRAME_LABEL_ALIGN, //! alignment flag for frame number + ONION_TURN, //! onion handle turn in degrees + QBOXLAYOUT_DIRECTION, //! direction of QBoxLayout + CENTER_ALIGN, //! horizontal / vertical align +}; +enum class PredefinedPath { + DRAG_HANDLE_CORNER, //! triangle corner at drag sidebar + BEGIN_EASE_TRIANGLE, //! triangle marking beginning of ease range + END_EASE_TRIANGLE, //! triangle marking end of ease range + BEGIN_PLAY_RANGE, //! play range markers + END_PLAY_RANGE, + VOLUME_SLIDER_TRACK, //! slider track + VOLUME_SLIDER_HEAD //! slider head +}; +enum class PredefinedPoint { + KEY_HIDDEN, //! move extender handle that much if key icons are disabled + EXTENDER_XY_RADIUS, //! x and y radius for rounded rectangle + VOLUME_DIVISIONS_TOP_LEFT //! where to draw volume slider +}; +enum class PredefinedRange { + HEADER_FRAME, //! size of of column header height(v) / row header width(h) + HEADER_LAYER, //! size of row header width(v) / column header height(h) +}; + +// Knows everything about geometry of a particular orientation. +class DVAPI Orientation { +protected: + map _rects; + map _lines; + map _dimensions; + map _paths; + map _points; + map _ranges; + +public: + virtual CellPosition xyToPosition(const QPoint &xy, + const ColumnFan *fan) const = 0; + virtual QPoint positionToXY(const CellPosition &position, + const ColumnFan *fan) const = 0; + virtual CellPositionRatio xyToPositionRatio(const QPoint &xy) const = 0; + virtual QPoint positionRatioToXY(const CellPositionRatio &ratio) const = 0; + + virtual int colToLayerAxis(int layer, const ColumnFan *fan) const = 0; + virtual int rowToFrameAxis(int frame) const = 0; + + virtual QPoint frameLayerToXY(int frameAxis, int layerAxis) const = 0; + QRect frameLayerRect(const NumberRange &frameAxis, + const NumberRange &layerAxis) const; + + virtual NumberRange layerSide(const QRect &area) const = 0; + virtual NumberRange frameSide(const QRect &area) const = 0; + virtual int layerAxis(const QPoint &xy) const = 0; + virtual int frameAxis(const QPoint &xy) const = 0; + //! top right corner in vertical layout. bottom left in horizontal + virtual QPoint topRightCorner(const QRect &area) const = 0; + QRect foldedRectangle(int layerAxis, const NumberRange &frameAxis, + int i) const; + QLine foldedRectangleLine(int layerAxis, const NumberRange &frameAxis, + int i) const; + + virtual CellPosition arrowShift(int direction) const = 0; + + //! line was vertical in vertical timeline. adjust accordingly + QLine verticalLine(int layerAxis, const NumberRange &frameAxis) const; + QLine horizontalLine(int frameAxis, const NumberRange &layerAxis) const; + + virtual bool isVerticalTimeline() const = 0; + virtual bool flipVolume() const = 0; + + virtual QString name() const = 0; + virtual QString caption() const = 0; + virtual const Orientation *next() const = 0; + + const QRect &rect(PredefinedRect which) const { return _rects.at(which); } + const QLine &line(PredefinedLine which) const { return _lines.at(which); } + int dimension(PredefinedDimension which) const { + return _dimensions.at(which); + } + const QPainterPath &path(PredefinedPath which) const { + return _paths.at(which); + } + const QPoint &point(PredefinedPoint which) const { return _points.at(which); } + const NumberRange &range(PredefinedRange which) const { + return _ranges.at(which); + } + + virtual int cellWidth() const = 0; + virtual int cellHeight() const = 0; + +protected: + void addRect(PredefinedRect which, const QRect &rect); + void addLine(PredefinedLine which, const QLine &line); + void addDimension(PredefinedDimension which, int dimension); + void addPath(PredefinedPath which, const QPainterPath &path); + void addPoint(PredefinedPoint which, const QPoint &point); + void addRange(PredefinedRange which, const NumberRange &range); +}; + +// Enumerates all orientations available in the system as global const objects. +class DVAPI Orientations { + const Orientation *_topToBottom, *_leftToRight; + vector _all; + + Orientations(); + +public: + ~Orientations(); + + static const Orientations &instance(); + + static const int COUNT = 2; + + static const Orientation *topToBottom(); + static const Orientation *leftToRight(); + + static const vector &all(); + + static const Orientation *byName(const QString &name); +}; + +#endif diff --git a/toonz/sources/include/saveloadqsettings.h b/toonz/sources/include/saveloadqsettings.h new file mode 100644 index 0000000..b7ecb09 --- /dev/null +++ b/toonz/sources/include/saveloadqsettings.h @@ -0,0 +1,18 @@ +#pragma once + +#ifndef SAVE_LOAD_QSETTINGS_INCLUDED +#define SAVE_LOAD_QSETTINGS_INCLUDED + +#include + +class QSettings; + +//! An interface that claims: this object wants to save / load something +//! into / from provided qsettings +class SaveLoadQSettings { +public: + virtual void save(QSettings &settings) const = 0; + virtual void load(QSettings &settings) = 0; +}; + +#endif diff --git a/toonz/sources/include/tcolorstyles.h b/toonz/sources/include/tcolorstyles.h index 2aecdad..1b9bb6c 100644 --- a/toonz/sources/include/tcolorstyles.h +++ b/toonz/sources/include/tcolorstyles.h @@ -273,6 +273,18 @@ Returns the main color by default. return DOUBLE; } //!< Returns the type of the specified parameter. + virtual bool hasParamDefault(int index) const { + return false; + } //!< Value of parameter can be reset to default. + + virtual void setParamDefault(int index) { + assert(false); + } //!< Reset value of parameter to default. + + virtual bool isParamDefault(int index) const { + return false; + } //!< Check if current value of parameter equals to default + virtual void setParamValue(int index, bool value) { assert(false); } //!< Assigns a value to the specified \p bool parameter. diff --git a/toonz/sources/include/tools/tool.h b/toonz/sources/include/tools/tool.h index 4ee09ea..fb95237 100644 --- a/toonz/sources/include/tools/tool.h +++ b/toonz/sources/include/tools/tool.h @@ -16,6 +16,7 @@ // Qt includes #include +#include #undef DVAPI #undef DVVAR @@ -91,16 +92,29 @@ public: ModifierMask m_modifiersMask; //!< Bitmask specifying key modifiers applying //! on the event. - bool m_leftButtonPressed; + Qt::MouseButtons m_buttons; + Qt::MouseButton m_button; + QPoint m_mousePos; // mouse position obtained with QMouseEvent::pos() or + // QTabletEvent::pos() + bool m_isTablet; public: TMouseEvent() - : m_pressure(255), m_modifiersMask(NO_KEY), m_leftButtonPressed(false) {} + : m_pressure(255) + , m_modifiersMask(NO_KEY) + , m_buttons(Qt::NoButton) + , m_button(Qt::NoButton) + , m_isTablet(false) {} bool isShiftPressed() const { return (m_modifiersMask & SHIFT_KEY); } bool isAltPressed() const { return (m_modifiersMask & ALT_KEY); } bool isCtrlPressed() const { return (m_modifiersMask & CTRL_KEY); } - bool isLeftButtonPressed() const { return m_leftButtonPressed; } + + bool isLeftButtonPressed() const { return (m_buttons & Qt::LeftButton) != 0; } + Qt::MouseButtons buttons() const { return m_buttons; } + Qt::MouseButton button() const { return m_button; } + QPoint mousePos() const { return m_mousePos; } + bool isTablet() const { return m_isTablet; } void setModifiers(bool shiftPressed, bool altPressed, bool ctrlPressed) { m_modifiersMask = ModifierMask((shiftPressed << SHIFT_BITSHIFT) | diff --git a/toonz/sources/include/tools/tooloptions.h b/toonz/sources/include/tools/tooloptions.h index abded96..92ca7a3 100644 --- a/toonz/sources/include/tools/tooloptions.h +++ b/toonz/sources/include/tools/tooloptions.h @@ -481,6 +481,7 @@ class BrushToolOptionsBox final : public ToolOptionsBox { private: class PresetNamePopup; PresetNamePopup *m_presetNamePopup; + void filterControls(); public: BrushToolOptionsBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle, diff --git a/toonz/sources/include/toonz/cellpositionratio.h b/toonz/sources/include/toonz/cellpositionratio.h new file mode 100644 index 0000000..a46d708 --- /dev/null +++ b/toonz/sources/include/toonz/cellpositionratio.h @@ -0,0 +1,48 @@ +#pragma once + +#ifndef CELL_POSITION_RATIO_INCLUDED +#define CELL_POSITION_RATIO_INCLUDED + +#undef DVAPI +#undef DVVAR +#ifdef TOONZLIB_EXPORTS +#define DVAPI DV_EXPORT_API +#define DVVAR DV_EXPORT_VAR +#else +#define DVAPI DV_IMPORT_API +#define DVVAR DV_IMPORT_VAR +#endif + +#include "tcommon.h" + +class DVAPI Ratio { + int m_num, m_denom; + + void normalize(); + Ratio normalized() const; + +public: + Ratio(int num, int denom); + + friend Ratio operator+(const Ratio &a, const Ratio &b); + friend Ratio operator-(const Ratio &a, const Ratio &b); + friend Ratio operator*(const Ratio &a, const Ratio &b); + friend Ratio operator/(const Ratio &a, const Ratio &b); + + friend int operator*(const Ratio &a, int b); + + bool operator!() const { return m_num == 0; } +}; + +class DVAPI CellPositionRatio { + Ratio m_frame, m_layer; + +public: + CellPositionRatio(const Ratio &frame, const Ratio &layer) + : m_frame(frame), m_layer(layer) {} + + Ratio frame() const { return m_frame; } + Ratio layer() const { return m_layer; } +}; + +#endif diff --git a/toonz/sources/include/toonz/columnfan.h b/toonz/sources/include/toonz/columnfan.h index 7c035ca..062510e 100644 --- a/toonz/sources/include/toonz/columnfan.h +++ b/toonz/sources/include/toonz/columnfan.h @@ -24,9 +24,10 @@ class TIStream; open folded columns, activate() and to know if column is folded or not, isActive(). - Class provides column x-axis coordinate too. - It's possible to know column index by column x-axis coordinate, colToX() - and vice versa, xToCol(). + Class provides column layer-axis coordinate too. + It's possible to know column index by column layer-axis coordinate, + colToLayerAxis() + and vice versa, layerAxisToCol(). */ //============================================================================= @@ -40,6 +41,7 @@ class DVAPI ColumnFan { std::vector m_columns; std::map m_table; int m_firstFreePos; + int m_unfolded, m_folded; /*! Called by activate() and deactivate() to update columns coordinates. @@ -52,6 +54,9 @@ Constructs a ColumnFan with default value. */ ColumnFan(); + //! Adjust column sizes when switching orientation + void setDimension(int unfolded); + /*! Set column \b col not folded. \sa deactivate() and isActive() @@ -69,15 +74,19 @@ Return true if column \b col is active, column is not folded, else return false. bool isActive(int col) const; /*! -Return column index of column in x-axis coordinate \b x. -\sa colToX() +Return column index of column in layer axis (x for vertical timeline, y for +horizontal). +\sa colToLayerAxis() */ - int xToCol(int x) const; + int layerAxisToCol(int layerAxis) const; /*! -Return column x-axis coordinate of column identify with \b col. -\sa xToCol() +Return layer coordinate (x for vertical timeline, y for horizontal) +of column identified by \b col. +\sa layerAxisToCol() */ - int colToX(int col) const; + int colToLayerAxis(int col) const; + + void copyFoldedStateFrom(const ColumnFan &from); bool isEmpty() const; diff --git a/toonz/sources/include/toonz/mypaint.h b/toonz/sources/include/toonz/mypaint.h new file mode 100644 index 0000000..9bbeeb9 --- /dev/null +++ b/toonz/sources/include/toonz/mypaint.h @@ -0,0 +1,352 @@ +#pragma once + +#ifndef MYPAINT_HPP +#define MYPAINT_HPP + +#include +#include +#include + +extern "C" { + #include + #include + #include +} + +namespace mypaint { + class Brush; + + //======================================================= + // + // Dab + // + //======================================================= + + class Dab { + public: + float x; + float y; + float radius; + float colorR; + float colorG; + float colorB; + float opaque; + float hardness; + float alphaEraser; + float aspectRatio; + float angle; + float lockAlpha; + float colorize; + + Dab(): + x(), y(), radius(), + colorR(), colorG(), colorB(), + opaque(), hardness(), alphaEraser(), + aspectRatio(), angle(), + lockAlpha(), colorize() + { } + + Dab( + float x, float y, float radius, + float colorR = 0.f, float colorG = 0.f, float colorB = 0.f, + float opaque = 1.f, float hardness = 0.5f, float alphaEraser = 1.f, + float aspectRatio = 1.f, float angle = 0.f, + float lockAlpha = 0.f, float colorize = 0.f + ): + x(x), y(y), radius(radius), + colorR(colorR), colorG(colorG), colorB(colorB), + opaque(opaque), hardness(hardness), alphaEraser(alphaEraser), + aspectRatio(aspectRatio), angle(angle), + lockAlpha(lockAlpha), colorize(lockAlpha) + { } + + void clamp() { + radius = fabsf(radius); + colorR = std::min(std::max(colorR, 0.f), 1.f); + colorG = std::min(std::max(colorG, 0.f), 1.f); + colorB = std::min(std::max(colorB, 0.f), 1.f); + opaque = std::min(std::max(opaque, 0.f), 1.f); + hardness = std::min(std::max(hardness, 0.f), 1.f); + alphaEraser = std::min(std::max(alphaEraser, 0.f), 1.f); + aspectRatio = std::max(aspectRatio, 1.f); + lockAlpha = std::min(std::max(lockAlpha, 0.f), 1.f); + colorize = std::min(std::max(colorize, 0.f), 1.f); + } + + Dab getClamped() const + { Dab dab(*this); dab.clamp(); return dab; } + }; + + + //======================================================= + // + // Surface + // + //======================================================= + + class Surface { + friend class Brush; + + struct InternalSurface: public MyPaintSurface { + Surface *m_owner; + }; + + InternalSurface m_surface; + + static int internalDrawDab( + MyPaintSurface *self, + float x, float y, float radius, + float colorR, float colorG, float colorB, + float opaque, float hardness, float alphaEraser, + float aspectRatio, float angle, + float lockAlpha, float colorize ) + { + return static_cast(self)->m_owner->drawDab( Dab( + x, y, radius, + colorR, colorG, colorB, + opaque, hardness, alphaEraser, + aspectRatio, angle, + lockAlpha, colorize )); + } + + static void internalGetColor( + MyPaintSurface *self, + float x, float y, float radius, + float *colorR, float *colorG, float *colorB, float *colorA ) + { + static_cast(self)->m_owner->getColor( + x, y, + radius, + *colorR, *colorG, *colorB, *colorA); + } + + public: + Surface(): + m_surface() + { + m_surface.m_owner = this; + m_surface.draw_dab = internalDrawDab; + m_surface.get_color = internalGetColor; + } + + virtual ~Surface() { } + + virtual bool getColor( + float x, float y, float radius, + float &colorR, float &colorG, float &colorB, float &colorA ) = 0; + + virtual bool drawDab(const Dab &dab) = 0; + }; + + //======================================================= + // + // Brush + // + //======================================================= + + class Brush { + MyPaintBrush *m_brush; + + public: + Brush(): + m_brush(mypaint_brush_new()) + { fromDefaults(); } + + Brush(const Brush &other): + m_brush(mypaint_brush_new()) + { fromBrush(other); } + + ~Brush() + { mypaint_brush_unref(m_brush); } + + Brush& operator= (const Brush &other) { + fromBrush(other); + return *this; + } + + void reset() + { mypaint_brush_reset(m_brush); } + + void newStroke() + { mypaint_brush_new_stroke(m_brush); } + + int strokeTo(Surface &surface, float x, float y, + float pressure, float xtilt, float ytilt, double dtime) + { + return mypaint_brush_stroke_to(m_brush, &surface.m_surface, + x, y, pressure, xtilt, ytilt, dtime); + } + + void setBaseValue(MyPaintBrushSetting id, float value) + { mypaint_brush_set_base_value(m_brush, id, value); } + + float getBaseValue(MyPaintBrushSetting id) const + { return mypaint_brush_get_base_value(m_brush, id); } + + bool isConstant(MyPaintBrushSetting id) const + { return mypaint_brush_is_constant(m_brush, id); } + + int getInputsUsedN(MyPaintBrushSetting id) const + { return mypaint_brush_get_inputs_used_n(m_brush, id); } + + void setMappingN(MyPaintBrushSetting id, MyPaintBrushInput input, int n) + { mypaint_brush_set_mapping_n(m_brush, id, input, n); } + + int getMappingN(MyPaintBrushSetting id, MyPaintBrushInput input) const + { return mypaint_brush_get_mapping_n(m_brush, id, input); } + + void setMappingPoint(MyPaintBrushSetting id, MyPaintBrushInput input, int index, float x, float y) + { mypaint_brush_set_mapping_point(m_brush, id, input, index, x, y); } + + void getMappingPoint(MyPaintBrushSetting id, MyPaintBrushInput input, int index, float &x, float &y) const + { mypaint_brush_get_mapping_point(m_brush, id, input, index, &x, &y); } + + float getState(MyPaintBrushState i) const + { return mypaint_brush_get_state(m_brush, i); } + + void setState(MyPaintBrushState i, float value) + { return mypaint_brush_set_state(m_brush, i, value); } + + double getTotalStrokePaintingTime() const + { return mypaint_brush_get_total_stroke_painting_time(m_brush); } + + void setPrintInputs(bool enabled) + { mypaint_brush_set_print_inputs(m_brush, enabled); } + + void fromDefaults() { + mypaint_brush_from_defaults(m_brush); + } + + void fromBrush(const Brush &other) { + for(int i = 0; i < MYPAINT_BRUSH_SETTINGS_COUNT; ++i) { + MyPaintBrushSetting id = (MyPaintBrushSetting)i; + setBaseValue(id, other.getBaseValue(id)); + for(int j = 0; j < MYPAINT_BRUSH_INPUTS_COUNT; ++j) { + MyPaintBrushInput input = (MyPaintBrushInput)j; + int n = other.getMappingN(id, input); + setMappingN(id, input, n); + for(int index = 0; index < n; ++index) { + float x = 0.f, y = 0.f; + other.getMappingPoint(id, input, index, x, y); + setMappingPoint(id, input, index, x, y); + } + } + } + } + + bool fromString(const std::string &s) { + return mypaint_brush_from_string(m_brush, s.c_str()); + } + }; + + //======================================================= + // + // Setting + // + //======================================================= + + class Setting final { + public: + MyPaintBrushSetting id; + std::string key; + std::string name; + std::string tooltip; + bool constant; + float min; + float def; + float max; + + private: + Setting(): id(), constant(), min(), def(), max() { } + Setting(const Setting&): id(), constant(), min(), def(), max() { } + + public: + static const Setting* all() { + static bool initialized = false; + static Setting settings[MYPAINT_BRUSH_SETTINGS_COUNT]; + if (!initialized) { + for(int i = 0; i < MYPAINT_BRUSH_SETTINGS_COUNT; ++i) { + const MyPaintBrushSettingInfo *info = mypaint_brush_setting_info((MyPaintBrushSetting)i); + settings[i].id = (MyPaintBrushSetting)i; + settings[i].key = info->cname; + settings[i].name = mypaint_brush_setting_info_get_name(info); + settings[i].tooltip = mypaint_brush_setting_info_get_tooltip(info); + settings[i].constant = info->constant; + settings[i].min = info->min; + settings[i].def = info->def; + settings[i].max = info->max; + } + } + return settings; + } + + static const Setting& byId(MyPaintBrushSetting id) + { return all()[id]; } + + static const Setting* findByKey(const std::string &key) { + const Setting* settings = all(); + for(int i = 0; i < MYPAINT_BRUSH_SETTINGS_COUNT; ++i) + if (settings[i].key == key) + return &settings[i]; + return 0; + } + }; + + //======================================================= + // + // Input + // + //======================================================= + + class Input final { + public: + MyPaintBrushInput id; + std::string key; + std::string name; + std::string tooltip; + float hardMin; + float softMin; + float normal; + float softMax; + float hardMax; + + private: + Input(): id(), hardMin(), softMin(), normal(), softMax(), hardMax() { } + Input(const Input&): id(), hardMin(), softMin(), normal(), softMax(), hardMax() { } + + public: + static const Input* all() { + static bool initialized = false; + static Input inputs[MYPAINT_BRUSH_INPUTS_COUNT]; + if (!initialized) { + for(int i = 0; i < MYPAINT_BRUSH_INPUTS_COUNT; ++i) { + const MyPaintBrushInputInfo *info = mypaint_brush_input_info((MyPaintBrushInput)i); + inputs[i].id = (MyPaintBrushInput)i; + inputs[i].key = info->cname; + inputs[i].name = mypaint_brush_input_info_get_name(info); + inputs[i].tooltip = mypaint_brush_input_info_get_tooltip(info); + inputs[i].hardMin = info->hard_min; + inputs[i].softMin = info->soft_min; + inputs[i].normal = info->normal; + inputs[i].softMax = info->soft_max; + inputs[i].hardMax = info->hard_max; + } + } + return inputs; + } + + static const Input& byId(MyPaintBrushInput id) { + return all()[id]; + } + + static const Input* findByKey(const std::string &key) { + const Input* inputs = all(); + for(int i = 0; i < MYPAINT_BRUSH_INPUTS_COUNT; ++i) + if (inputs[i].key == key) + return &inputs[i]; + return 0; + } + }; +} + +#endif // MYPAINT_HPP diff --git a/toonz/sources/include/toonz/mypaintbrushstyle.h b/toonz/sources/include/toonz/mypaintbrushstyle.h new file mode 100644 index 0000000..d4895fb --- /dev/null +++ b/toonz/sources/include/toonz/mypaintbrushstyle.h @@ -0,0 +1,122 @@ +#pragma once + +#ifndef MYPAINTBRUSHSTYLE_H +#define MYPAINTBRUSHSTYLE_H + +#include "mypaint.h" + +// TnzCore includes +#include "imagestyles.h" + +#undef DVAPI +#undef DVVAR + +#ifdef TOONZLIB_EXPORTS +#define DVAPI DV_EXPORT_API +#define DVVAR DV_EXPORT_VAR +#else +#define DVAPI DV_IMPORT_API +#define DVVAR DV_IMPORT_VAR +#endif + +//********************************************************************************** +// TMyPaintBrushStyle declaration +//********************************************************************************** + +class DVAPI TMyPaintBrushStyle final : public TColorStyle, TImageStyle { +private: + TFilePath m_path; + TFilePath m_fullpath; + mypaint::Brush m_brushOriginal; + mypaint::Brush m_brushModified; + TRasterP m_preview; + TPixel32 m_color; + + std::map m_baseValues; + + TFilePath decodePath(const TFilePath &path) const; + void loadBrush(const TFilePath &path); + +public: + TMyPaintBrushStyle(); + TMyPaintBrushStyle(const TFilePath &path); + TMyPaintBrushStyle(const TMyPaintBrushStyle &other); + ~TMyPaintBrushStyle(); + + TColorStyle *clone() const override + { return new TMyPaintBrushStyle(*this); } + + TColorStyle ©(const TColorStyle &other) override; + + static std::string getBrushType(); + static TFilePathSet getBrushesDirs(); + + const TFilePath& getPath() const + { return m_path; } + const mypaint::Brush& getBrush() const + { return m_brushModified; } + const TRasterP& getPreview() const + { return m_preview; } + + TStrokeProp* makeStrokeProp(const TStroke * /* stroke */) override + { return 0; } + TRegionProp* makeRegionProp(const TRegion * /* region */) override + { return 0; } + bool isRegionStyle() const override + { return false; } + bool isStrokeStyle() const override + { return false; } + + bool hasMainColor() const override + { return true; } + TPixel32 getMainColor() const override + { return m_color; } + void setMainColor(const TPixel32 &color) override + { m_color = color; } + + int getTagId() const override + { return 4001; } + + QString getDescription() const override; + + void setBaseValue(MyPaintBrushSetting id, bool enable, float value); + void resetBaseValues(); + + void setBaseValue(MyPaintBrushSetting id, float value) + { setBaseValue(id, true, value); } + + void setBaseValueEnabled(MyPaintBrushSetting id, bool enable) + { setBaseValue(id, enable, getBaseValue(id)); } + + const std::map getBaseValues() const + { return m_baseValues; } + + float getBaseValue(MyPaintBrushSetting id) const { + std::map::const_iterator i = m_baseValues.find(id); + return i == m_baseValues.end() + ? m_brushOriginal.getBaseValue(id) + : i->second; + } + + bool getBaseValueEnabled(MyPaintBrushSetting id) const { + std::map::const_iterator i = m_baseValues.find(id); + return i != m_baseValues.end(); + } + + int getParamCount() const override; + QString getParamNames(int index) const override; + ParamType getParamType(int index) const override; + bool hasParamDefault(int index) const override; + void setParamDefault(int index) override; + bool isParamDefault(int index) const override; + void getParamRange(int index, double &min, double &max) const override; + void setParamValue(int index, double value) override; + double getParamValue(double_tag, int index) const override; + +protected: + void makeIcon(const TDimension &d) override; + void loadData(TInputStreamInterface &) override; + void saveData(TOutputStreamInterface &) const override; +}; + +#endif diff --git a/toonz/sources/include/toonz/mypainthelpers.hpp b/toonz/sources/include/toonz/mypainthelpers.hpp new file mode 100644 index 0000000..929a29f --- /dev/null +++ b/toonz/sources/include/toonz/mypainthelpers.hpp @@ -0,0 +1,601 @@ +#pragma once + +#ifndef MYPAINTHELPERS_H +#define MYPAINTHELPERS_H + +#include +#include + +#include "mypaint.h" + +namespace mypaint { + namespace helpers { + const float precision = 1e-4f; + + typedef void ReadPixelFunc( + const void *pixel, + float &colorR, + float &colorG, + float &colorB, + float &colorA ); + typedef void WritePixelFunc( + void *pixel, + float colorR, + float colorG, + float colorB, + float colorA ); + typedef bool AskAccessFunc( + void *surfaceController, + const void *surfacePointer, + int x0, + int y0, + int x1, + int y1 ); + + inline void dummyReadPixel(const void*, float&, float&, float&, float&) { } + inline void dummyWritePixel(void*, float, float, float, float) { } + inline bool dummyAskAccess(void*, const void*, int, int, int, int) { return true; } + + template< ReadPixelFunc read = dummyReadPixel, + WritePixelFunc write = dummyWritePixel, + AskAccessFunc askRead = dummyAskAccess, + AskAccessFunc askWrite = dummyAskAccess > + class SurfaceCustom: public Surface { + public: + void *pointer; + int width; + int height; + int pixelSize; + int rowSize; + void *controller; + bool antialiasing; + + SurfaceCustom(): + pointer(), width(), height(), pixelSize(), rowSize(), controller(), antialiasing(true) + { } + + SurfaceCustom(void *pointer, int width, int height, int pixelSize, int rowSize = 0, void *controller = 0, bool antialiasing = true): + pointer(pointer), + width(width), + height(height), + pixelSize(pixelSize), + rowSize(rowSize ? rowSize : width*pixelSize), + controller(controller), + antialiasing(antialiasing) + { } + + private: + template< bool enableAspect, // 2 variants + bool enableAntialiasing, // 1 variants (true) + bool enableHardnessOne, // 3 variants + bool enableHardnessHalf, // -- + bool enablePremult, // 1 variant (true) + bool enableBlendNormal, // 2 variants + bool enableBlendLockAlpha, // 2 variants + bool enableBlendColorize, // 2 variants + bool enableSummary > // 1 variants (false) Total: 48 copies of function + bool drawDabCustom(const Dab &dab, float *colorSummary) { + const float antialiasing = 0.66f; // equals to drawDab::minRadiusX + const float lr = 0.30f; + const float lg = 0.59f; + const float lb = 0.11f; + + if (!enableBlendNormal && !enableBlendLockAlpha && !enableBlendColorize && !enableSummary) + return false; + + // prepare summary + double colorSumR, colorSumG, colorSumB, colorSumA, colorSumW; + if (enableSummary) { + colorSummary[0] = 0.f; + colorSummary[1] = 0.f; + colorSummary[2] = 0.f; + colorSummary[3] = 0.f; + colorSumR = 0.0; + colorSumG = 0.0; + colorSumB = 0.0; + colorSumA = 0.0; + colorSumW = 0.0; + } + + // bounding rect + int x0 = std::max(0, (int)floor(dab.x - dab.radius - 1.f + precision)); + int x1 = std::min(width-1, (int)ceil(dab.x + dab.radius + 1.f - precision)); + int y0 = std::max(0, (int)floor(dab.y - dab.radius - 1.f + precision)); + int y1 = std::min(height-1, (int)ceil(dab.y + dab.radius + 1.f - precision)); + if (x0 > x1 || y0 > y1) + return false; + + if (controller && !askRead(controller, pointer, x0, y0, x1, y1)) + return false; + if (enableBlendNormal || enableBlendLockAlpha || enableBlendColorize) + if (controller && !askWrite(controller, pointer, x0, y0, x1, y1)) + return false; + + assert(pointer); + + // prepare pixel iterator + int w = x1 - x0 + 1; + int h = y1 - y0 + 1; + char *pixel = (char*)pointer + rowSize*y0 + pixelSize*x0; + int pixelNextCol = pixelSize; + int pixelNextRow = rowSize - w*pixelSize; + + // prepare geometry iterators + float radiusInv = 1.f/dab.radius; + float dx = (float)x0 - dab.x + 0.5f; + float dy = (float)y0 - dab.y + 0.5f; + float ddx, ddxNextCol, ddxNextRow; + float ddy, ddyNextCol, ddyNextRow; + if (enableAspect) { + float angle = dab.angle*((float)M_PI/180.f); + float s = sinf(angle); + float c = cosf(angle); + + float radiusYInv = radiusInv*dab.aspectRatio; + + ddx = (dx*c + dy*s)*radiusInv; + ddxNextCol = c*radiusInv; + ddxNextRow = (s - c*(float)w)*radiusInv; + + ddy = (dy*c - dx*s)*radiusYInv; + ddyNextCol = -s*radiusYInv; + ddyNextRow = (c + s*(float)w)*radiusYInv; + } else { + ddx = dx*radiusInv; + ddxNextCol = radiusInv; + ddxNextRow = -radiusInv*(float)w; + + ddy = dy*radiusInv; + ddyNextCol = 0.f; + ddyNextRow = radiusInv; + } + + // prepare antialiasing + float hardness, ka0, ka1, kb1, kc1, kc2; + float aa, aa2, aaSqr, ddySqrMin, aspectRatioSqr; + if (enableAntialiasing) { + if (enableHardnessOne) { + } else + if (enableHardnessHalf) { + ka0 = 0.25f; + kc2 = 0.75f; + } else { + hardness = std::min(dab.hardness, 1.f - precision); + float hk = hardness/(hardness - 1.f); + ka0 = 0.25f/hk; + ka1 = 0.25f*hk; + kb1 = -0.5f*hk; + kc1 = ((ka0 - ka1)*hardness + 0.5f - kb1)*hardness; + kc2 = ka1 + kb1 + kc1; + } + + aa = antialiasing*radiusInv; + if (enableAspect) { + ddySqrMin = 0.5f*aa*dab.aspectRatio; + ddySqrMin *= ddySqrMin; + aspectRatioSqr = dab.aspectRatio*dab.aspectRatio; + } else { + aa2 = aa + aa; + aaSqr = aa*aa; + } + } else { + if (enableHardnessOne) { + } else + if (enableHardnessHalf) { + } else { + hardness = std::min(dab.hardness, 1.f - precision); + float hk = hardness/(hardness - 1.f); + ka0 = 1.f/hk; + ka1 = hk; + kb1 = -hk; + } + } + + // prepare blend + float opaque = dab.opaque; + float colorR, colorG, colorB; + if (enableBlendNormal || enableBlendLockAlpha || enableBlendColorize) { + colorR = dab.colorR; + colorG = dab.colorG; + colorB = dab.colorB; + } + float blendNormal, blendAlphaEraser; + if (enableBlendNormal) { + blendNormal = (1.f - dab.lockAlpha)*(1.f - dab.colorize); + blendAlphaEraser = dab.alphaEraser; + } + float blendLockAlpha; + if (enableBlendLockAlpha) { + blendLockAlpha = dab.lockAlpha; + } + float blendColorize, blendColorizeSrcLum; + if (enableBlendColorize) { + blendColorize = dab.colorize; + blendColorizeSrcLum = dab.colorR*lr + dab.colorG*lg + dab.colorB*lb; + } + + // process + for(int iy = h; iy; --iy, ddx += ddxNextRow, ddy += ddyNextRow, pixel += pixelNextRow) + for(int ix = w; ix; --ix, ddx += ddxNextCol, ddy += ddyNextCol, pixel += pixelNextCol) { + float o; + if (enableAntialiasing) { + float dd, dr; + if (enableAspect) { + float ddxSqr = ddx*ddx; + float ddySqr = std::max(ddySqrMin, ddy*ddy); + dd = ddxSqr + ddySqr; + float k = aa*sqrtf(ddxSqr + ddySqr*aspectRatioSqr); + dr = k*(2.f + k/dd); + } else { + dd = ddx*ddx + ddy*ddy; + dr = aa2*sqrtf(dd) + aaSqr; + } + + float dd0 = dd - dr; + if (dd0 > 1.f) + continue; + float dd1 = dd + dr; + + float o0, o1; + if (enableHardnessOne) { + o0 = dd0 < -1.f ? -0.5f + : 0.5f*dd0; + o1 = dd1 < 1.f ? 0.5f*dd1 + : 0.5f; + } else + if (enableHardnessHalf) { + o0 = dd0 < -1.f ? -0.25f + : dd0 < 0.f ? ( 0.25f*dd0 + 0.5f )*dd0 + : (-0.25f*dd0 + 0.5f )*dd0; + o1 = dd1 < 1.f ? (-0.25f*dd1 + 0.5f )*dd1 + : 0.25f; + } else { + o0 = dd0 < -1.f ? -kc2 + : dd0 < -hardness ? (-ka1*dd0 + kb1 )*dd0 - kc1 + : dd0 < 0.f ? (-ka0*dd0 + 0.5f )*dd0 + : dd0 < hardness ? ( ka0*dd0 + 0.5f )*dd0 + : ( ka1*dd0 + kb1 )*dd0 + kc1; + o1 = dd1 < hardness ? ( ka0*dd1 + 0.5f )*dd1 + : dd1 < 1.f ? ( ka1*dd1 + kb1 )*dd1 + kc1 + : kc2; + } + o = opaque*(o1 - o0)/dr; + } else { + float dd = ddx*ddx + ddy*ddy; + if (dd > 1.f) + continue; + if (enableHardnessOne) { + o = opaque; + } else + if (enableHardnessHalf) { + o = opaque*(1.f - dd); + } else { + o = opaque*(dd < hardness ? ka0*dd + 1.f : ka1*dd + kb1); + } + } + + if (o <= precision) + continue; + + // read pixel + float destR, destG, destB, destA; + read(pixel, destR, destG, destB, destA); + + if (enablePremult) { + destR *= destA; + destG *= destA; + destB *= destA; + } + + if (enableSummary) { + colorSumR += (double)(o*destR); + colorSumG += (double)(o*destG); + colorSumB += (double)(o*destB); + colorSumA += (double)(o*destA); + colorSumW += (double)o; + } + + if (!enableBlendNormal && !enableBlendLockAlpha && !enableBlendColorize) + continue; + + if (enableBlendNormal) { + float oa = blendNormal*o; + float ob = 1.f - oa; + oa *= blendAlphaEraser; + destR = oa*dab.colorR + ob*destR; + destG = oa*dab.colorG + ob*destG; + destB = oa*dab.colorB + ob*destB; + destA = oa + ob*destA; + } + + if (enableBlendLockAlpha) { + float oa = blendLockAlpha*o; + float ob = 1.f - oa; + oa *= destA; + destR = oa*colorR + ob*destR; + destG = oa*colorG + ob*destG; + destB = oa*colorB + ob*destB; + } + + if (enableBlendColorize) { + float dLum = destR*lr + destG*lg + destB*lb - blendColorizeSrcLum; + float r = colorR + dLum; + float g = colorG + dLum; + float b = colorB + dLum; + + float lum = r*lr + g*lg + b*lb; + float cmin = std::min(std::min(r, g), b); + float cmax = std::max(std::max(r, g), b); + if (cmin < 0.f) { + float k = lum/(lum - cmin); + r = lum + k*(r - lum); + g = lum + k*(g - lum); + b = lum + k*(b - lum); + } + if (cmax > 1.f) { + float k = (1.f - lum)/(cmax - lum); + r = lum + k*(r - lum); + g = lum + k*(g - lum); + b = lum + k*(b - lum); + } + + float oa = blendColorize*o; + float ob = 1.f - oa; + destR = oa*r + ob*destR; + destG = oa*g + ob*destG; + destB = oa*b + ob*destB; + } + + if (enablePremult) { + if (destA > precision) { + float oneDivA = 1.f/destA; + destR *= oneDivA; + destG *= oneDivA; + destB *= oneDivA; + } + } + + // clamp + destR = std::min(std::max(destR, 0.f), 1.f); + destG = std::min(std::max(destG, 0.f), 1.f); + destB = std::min(std::max(destB, 0.f), 1.f); + destA = std::min(std::max(destA, 0.f), 1.f); + + write(pixel, destR, destG, destB, destA); + } + + if (enableSummary) { + double k = colorSumA > precision ? 1.0/colorSumA : 0.0; + colorSummary[0] = (float)(k*colorSumR); + colorSummary[1] = (float)(k*colorSumG); + colorSummary[2] = (float)(k*colorSumB); + colorSummary[3] = (float)(colorSumW > precision ? colorSumA/colorSumW : 0.0); + } + + return true; + } + + template< bool enableAspect, + bool enableAntialiasing, + bool enableHardnessOne, + bool enableHardnessHalf, + bool enableBlendNormal, + bool enableBlendLockAlpha > + inline bool drawDabCheckBlendColorize(const Dab &dab) { + if (dab.colorize > precision) { + return drawDabCustom< + enableAspect, + enableAntialiasing, + enableHardnessOne, + enableHardnessHalf, + false, // enablePremult + enableBlendNormal, + enableBlendLockAlpha, + true, // enableBlendColorize, + false // enableSummary + >(dab, 0); + } else { + return drawDabCustom< + enableAspect, + enableAntialiasing, + enableHardnessOne, + enableHardnessHalf, + false, // enablePremult + enableBlendNormal, + enableBlendLockAlpha, + false, // enableBlendColorize, + false // enableSummary + >(dab, 0); + } + } + + template< bool enableAspect, + bool enableAntialiasing, + bool enableHardnessOne, + bool enableHardnessHalf, + bool enableBlendNormal > + inline bool drawDabCheckBlendLockAlpha(const Dab &dab) { + if (dab.lockAlpha > precision) { + return drawDabCheckBlendColorize< + enableAspect, + enableAntialiasing, + enableHardnessOne, + enableHardnessHalf, + enableBlendNormal, + true // enableBlendLockAlpha + >(dab); + } else { + return drawDabCheckBlendColorize< + enableAspect, + enableAntialiasing, + enableHardnessOne, + enableHardnessHalf, + enableBlendNormal, + false // enableBlendLockAlpha + >(dab); + } + } + + template< bool enableAspect, + bool enableAntialiasing, + bool enableHardnessOne, + bool enableHardnessHalf > + inline bool drawDabCheckBlendNormal(const Dab &dab) { + if ((1.f - dab.lockAlpha)*(1.f - dab.colorize) > precision) { + return drawDabCheckBlendLockAlpha< + enableAspect, + enableAntialiasing, + enableHardnessOne, + enableHardnessHalf, + true // enableBlendNormal + >(dab); + } else { + return drawDabCheckBlendLockAlpha< + enableAspect, + enableAntialiasing, + enableHardnessOne, + enableHardnessHalf, + false // enableBlendNormal + >(dab); + } + } + + template< bool enableAspect, + bool enableAntialiasing > + inline bool drawDabCheckHardness(const Dab &dab) { + if (dab.hardness >= 1.f - precision) { + return drawDabCheckBlendNormal< + enableAspect, + enableAntialiasing, + true, // enableHardnessOne + false // enableHardnessHalf + >(dab); + } else + if (fabsf(dab.hardness - 0.5f) <= precision) { + return drawDabCheckBlendNormal< + enableAspect, + enableAntialiasing, + false, // enableHardnessOne + true // enableHardnessHalf + >(dab); + } else { + return drawDabCheckBlendNormal< + enableAspect, + enableAntialiasing, + false, // enableHardnessOne + false // enableHardnessHalf + >(dab); + } + } + + template< bool enableAspect > + inline bool drawDabCheckAntialiasing(const Dab &dab, bool antialiasing) { + if (antialiasing) { + return drawDabCheckHardness< + enableAspect, + true // enableAntialiasing + >(dab); + } else { + return drawDabCheckHardness< + enableAspect, + false // enableAntialiasing + >(dab); + } + } + + inline bool drawDabCheckAspect(const Dab &dab, bool antialiasing) { + if (dab.aspectRatio > 1.f + precision) { + return drawDabCheckAntialiasing< + true // enableAspect + >(dab, antialiasing); + } else { + return drawDabCheckAntialiasing< + false // enableAspect + >(dab, antialiasing); + } + } + + public: + bool getColor(float x, float y, float radius, + float &colorR, float &colorG, float &colorB, float &colorA) + { + float color[4]; + bool done = drawDabCustom< + false, // enableAspect + false, // enableAntialiasing + false, // enableHardnessOne + true, // enableHardnessHalf + false, // enablePremult + false, // enableBlendNormal + false, // enableBlendLockAlpha + false, // enableBlendColorize + true // enableSummary + >(Dab(x, y, radius), color); + colorR = color[0]; + colorG = color[1]; + colorB = color[2]; + colorA = color[3]; + return done; + } + + bool drawDab(const Dab &dab) { + const float minRadiusX = 0.66f; // equals to drawDabCustom::antialiasing + const float minRadiusY = 3.f*minRadiusX; + const float maxAspect = 10.f; + const float minOpaque = 1.f/256.f; + + // check limits + Dab d = dab.getClamped(); + if (d.radius <= precision) + return true; + if (d.hardness <= precision) + return true; + + // fix aspect + if (d.aspectRatio > maxAspect) { + d.opaque *= maxAspect/d.aspectRatio; + d.aspectRatio = maxAspect; + } + + // fix radius + float hardnessSize = 1.f; + if (d.radius < minRadiusX) { + d.opaque *= d.radius/minRadiusX; + d.radius = minRadiusX; + } + if (d.hardness < 0.5f) { + hardnessSize = sqrtf(d.hardness/(1.f - d.hardness)); + float radiusH = d.radius*hardnessSize; + if (radiusH < minRadiusX) { + d.opaque *= radiusH/minRadiusX; + hardnessSize = minRadiusX/d.radius; + float hardnessSizeSqr = hardnessSize*hardnessSize; + d.hardness = hardnessSizeSqr/(1.f + hardnessSizeSqr); + radiusH = minRadiusX; + } + if (d.hardness*d.opaque < minOpaque) { + d.radius = radiusH; + d.hardness = 0.5f; + hardnessSize = 1.f; + } + } + + float radiusYh = d.radius*hardnessSize/d.aspectRatio; + float actualMinRadiusY = std::min(d.radius, minRadiusY); + if (radiusYh < actualMinRadiusY) { + float k = radiusYh/actualMinRadiusY; + d.opaque *= k; + d.aspectRatio *= k; + } + + // check opaque + if (d.opaque < minOpaque) + return false; + + return drawDabCheckAspect(d, antialiasing); + } + }; // SurfaceCustom + } // helpers +} // mypaint + +#endif // MYPAINTHELPERS_H diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index e269580..fadefd0 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -272,6 +272,9 @@ public: void setDefaultImportPolicy(int policy); int getDefaultImportPolicy() { return m_importPolicy; } + void setIgnoreImageDpi(bool on); + bool isIgnoreImageDpiEnabled() const { return m_ignoreImageDpi; } + // Drawing tab void setScanLevelType(std::string s); @@ -362,6 +365,9 @@ public: void enableExpandFunctionHeader(bool on); bool isExpandFunctionHeaderEnabled() const { return m_expandFunctionHeader; } + void enableShowColumnNumbers(bool on); + bool isShowColumnNumbersEnabled() const { return m_showColumnNumbers; } + // Animation tab void setKeyframeType(int s); @@ -503,14 +509,14 @@ private: m_rewindAfterPlaybackEnabled, m_fitToFlipbookEnabled, m_autosaveEnabled, m_autosaveSceneEnabled, m_autosaveOtherFilesEnabled, m_defaultViewerEnabled, m_pixelsOnly, m_showXSheetToolbar, - m_expandFunctionHeader; + m_expandFunctionHeader, m_showColumnNumbers; bool m_rasterOptimizedMemory, m_saveUnpaintedInCleanup, m_askForOverrideRender, m_automaticSVNFolderRefreshEnabled, m_SVNEnabled, m_levelsBackupEnabled, m_minimizeSaveboxAfterEditing, m_sceneNumberingEnabled, m_animationSheetEnabled, m_inksOnly, m_startupPopupEnabled; bool m_fillOnlySavebox, m_show0ThickLines, m_regionAntialias; - bool m_onionSkinDuringPlayback; + bool m_onionSkinDuringPlayback, m_ignoreImageDpi; TPixel32 m_viewerBGColor, m_previewBGColor, m_chessboardColor1, m_chessboardColor2; bool m_showRasterImagesDarkenBlendedInViewer, diff --git a/toonz/sources/include/toonz/txsheet.h b/toonz/sources/include/toonz/txsheet.h index f75b926..0886596 100644 --- a/toonz/sources/include/toonz/txsheet.h +++ b/toonz/sources/include/toonz/txsheet.h @@ -13,6 +13,8 @@ // TnzLib includes #include "toonz/txshcolumn.h" +#include "cellposition.h" + // STD includes #include @@ -46,6 +48,7 @@ class ToonzScene; class TXshSoundColumn; class TXshNoteSet; class TFrameId; +class Orientation; //============================================================================= @@ -58,62 +61,68 @@ class TFrameId; /*! Inherits \b TSmartObject and \b TPersist. - The class provides a collection of functions that returns xsheet + The class provides a collection of functions that returns xsheet elements, defined in - struct \b TXsheetImp, and enables manipulation of these. Most -important xsheet elements - are: a \b column \b set \b TColumnSetT, a \b pegbar \b tree \b + struct \b TXsheetImp, and enables manipulation of these. Most important +xsheet elements + are: a \b column \b set \b TColumnSetT, a \b pegbar \b tree \b TStageObjectTree, a \b fx - \b dag \b FxDag, a \b sound \b track \b TSoundTrack and a \b -scene \b ToonzScene. - - A \b column \b set contains all xsheet column. A collection of -function, concern column - set, allows to manage xsheet column. It's possible to know -xsheet column number, - getColumnCount(), know first not empty column index, + \b dag \b FxDag, a \b sound \b track \b TSoundTrack and a \b scene \b +ToonzScene. + + For purposes of this class, a Column is a graphics layer, and a +row is a frame number. + (Whether horizontal or vertial is a matter of displaying). + + A \b column \b set contains all xsheet columns. A collection of +functions, concerning column + set, allows to manage xsheet column. It's possible to know xsheet column +count, + getColumnCount(), know first non empty column index, getFirstFreeColumnIndex(), - or know if column in datum index is empty, isColumnEmpty(). You -can work on single xsheet - column, getColumn(), using its indexes: insert and remove a -column with insertColumn() - and removeColumn() or move column from an index to another using + or know if column in datum index is empty, isColumnEmpty(). You can work +on single xsheet + column, getColumn(), using its indexes: insert and remove a column with +insertColumn() + and removeColumn() or move column from an index to another using moveColumn(). - You can manage also column visualization in xsheet, using the -xsheet object \b ColumnFan - getColumnFan(), and find column icon getColumnIcon(). - - It's possible work on xsheet cells directly, getCell() and -setCell() or getCells() and - setCells(); cells are identified in xsheet by two index one for -row and one for column. - You can insert, remove or clear cells using insertCells(), -removeCells() or clearCells(); - the difference between the remove and the clear function is the -shift of remains cells. - Also there are functions to manipulate cells reverseCells(), + You can manage also column visualization in xsheet, using the xsheet +object \b ColumnFan + getColumnFan(), and find column icon getColumnIcon(). + + cell positions will be identified by a pair of row+column index, +which is a separate class. + + It's possible work on xsheet cells directly, getCell() and setCell() or +getCells() and + setCells(); cells are identified in xsheet by two index one for row and +one for column. + You can insert, remove or clear cells using insertCells(), removeCells() +or clearCells(); + the difference between the remove and the clear function is the shift of +remains cells. + Also there are functions to manipulate cells reverseCells(), swingCells(), - incrementCells(), duplicateCells(), int upTo, stepCells(), -eachCells(). + incrementCells(), duplicateCells(), int upTo, stepCells(), eachCells(). - About \b pegbar \b tree \b TStageObjectTree, it's possible to -manage it through the stage object's - related functions. + About \b pegbar \b tree \b TStageObjectTree, it's possible to manage it +through the stage object's + related functions. - The \b fx \b dag \b FxDag getFxDag() is not managed with direct + The \b fx \b dag \b FxDag getFxDag() is not managed with direct functions but is always - up to date; in fact same functions update it. For example + up to date; in fact same functions update it. For example insertColumn(), if necessary, - insert column index in fx dag, the same happen in setCells(). + insert column index in fx dag, the same happen in setCells(). - The \b sound \b track \b TSoundTrack contain a mixed sound, -computed using makeSound(), - of all \b TXshSoundColumn present in xsheet. + The \b sound \b track \b TSoundTrack contain a mixed sound, computed +using makeSound(), + of all \b TXshSoundColumn present in xsheet. - It's possible take and know the \b scene \b ToonzScene to which -the xsheet refers using - getScene() and setScene(). + It's possible take and know the \b scene \b ToonzScene to which the +xsheet refers using + getScene() and setScene(). */ class DVAPI TXsheet final : public TSmartObject, public TPersist { @@ -159,64 +168,66 @@ public: \sa getMaxFrame() */ int getFrameCount() const; - /*! Returns true if cells contained in rect delimited by first row \b \e r0, - last row \b \e r1 - and first column \b \e c0, last column \b \e c1 are empty; otherwise, - returns false. + + /*! Returns true if all cells in rect delimited by first frame \b \e + pos0.frame, + last frame \b \e pos1.frame and first layer \b \e pos0.layer, last layer \b + \e pos1.layer + are empty; otherwise, false. */ - bool isRectEmpty(int r0, int c0, int r1, int c1) const; + bool isRectEmpty(const CellPosition &pos0, const CellPosition &pos1) const; + /*! Returns the \b TXshCell cell in row identified by index \b \e row and - column identified by - index \b \e col. If column \b TXshColumnP in \b \e col is empty return + column identified by index \b \e col. If column \b TXshColumnP in \b \e col + is empty return an empty cell. \sa setCell(), getCells(), setCells() */ const TXshCell &getCell(int row, int col) const; + const TXshCell &getCell(const CellPosition &pos) const; + bool setCell(int row, int col, const TXshCell &cell); /*! Set \b \e cells[] to \b \e rowCount cells of column identified by index \b - \e col starting from - row identified by index \b \e row. If column is empty or is not a \b - TXshCellColumn - set \b \e cells[] to \b \e rowCount empty cells. + \e col starting from row identified by index \b \e row. If column is empty + or is not a \b + TXshCellColumn set \b \e cells[] to \b \e rowCount empty cells. \sa getCells(), setCells(), getCell() */ void getCells(int row, int col, int rowCount, TXshCell cells[]) const; /*! If column identified by index \b \e col is a \b TXshCellColumn or is empty -and is not - locked, this method sets to \b \e cells[] the given \b \e rowCount -cells of column \b \e col starting from - row \b \e row. If column in \b \e col is empty it creates a new column -recalling - \b TColumnSetT::touchColumn() and sets the new cells to \b \e cells[], -and on creating a new - column it adds it to fx dag \b FxDag. - If cells in \b \e row and \b \e col are not empty recalls \b -TXshCellColumn::setCells(), - insert the new cells \b \e cells[] in \b \e row \b \e col and shift -old cells. - If xsheet change it updates xsheet's frame count. -Return false if cannot set cells. - \sa getCells(), setCell(), getCell() + and is not + locked, this method sets to \b \e cells[] the given \b \e rowCount cells of + column \b \e col starting from + row \b \e row. If column in \b \e col is empty it creates a new column + recalling + \b TColumnSetT::touchColumn() and sets the new cells to \b \e cells[], and + on creating a new + column it adds it to fx dag \b FxDag. + If cells in \b \e row and \b \e col are not empty recalls \b + TXshCellColumn::setCells(), + insert the new cells \b \e cells[] in \b \e row \b \e col and shift old + cells. + If xsheet change it updates xsheet's frame count. Return false if cannot set + cells. + \sa getCells(), setCell(), getCell() */ bool setCells(int row, int col, int rowCount, const TXshCell cells[]); /*! If column identified by index \b \e col is not empty, is a \b \e - TXshCellColumn and is not - locked this method inserts in row identified by index \b \e row \b \e - rowCount empty cells, it calls - TXshCellColumn::insertEmptyCells(). An update of xsheet's frame count + TXshCellColumn and is not locked this method inserts in row identified by + index \b \e row \b \e + rowCount empty cells, it calls TXshCellColumn::insertEmptyCells(). An + update of xsheet's frame count is performed. \sa setCells(), removeCells() */ void insertCells(int row, int col, int rowCount = 1); /*! If column identified by index \b \e col is not empty, is a \b - TXshCellColumn and is not - locked, this method removes \b \e rowCount cells starting from \b \e - row, it calls - TXshCellColumn::removeCells(). It removes cells without shift - remaining cells. - An update of xsheet's frame count is performed. + TXshCellColumn and is not locked, this method removes \b \e rowCount cells + starting from \b \e + row, it calls TXshCellColumn::removeCells(). It removes cells without shift + remaining cells. An update of xsheet's frame count is performed. \sa clearCells(), insertCells() */ void removeCells(int row, int col, int rowCount = 1); @@ -232,10 +243,10 @@ Return false if cannot set cells. */ void clearAll(); /*! Returns cell range of column identified by index \b \e col and set \b \e - r0 and \b \e r1 - respectively to first and last not empty cell, it then recalls \b - TXshCellColumn::getRange(). - If column is empty or is not a \b TXshCellColumn this method returns + r0 and \b \e r1 respectively to first and last not empty cell, it then + recalls \b + TXshCellColumn::getRange(). If column is empty or is not a \b + TXshCellColumn this method returns zero and sets \b \e r0 to 0 and \b \e r1 to -1. */ @@ -504,8 +515,9 @@ in TXsheetImp. FxDag *getFxDag() const; /*! Returns a pointer to object \b ColumnFan contained in \b TXsheetImp, this object allows the user to manage columns visualization in xsheet. + TXsheet maintains one column fan per each orientation. */ - ColumnFan *getColumnFan() const; + ColumnFan *getColumnFan(const Orientation *o) const; /*! Returns a pointer to \b ToonzScene contained in \b TXsheetImp, that is the scene to which the xsheet refers. diff --git a/toonz/sources/include/toonz/txshsoundlevel.h b/toonz/sources/include/toonz/txshsoundlevel.h index 3d693e3..c536ae9 100644 --- a/toonz/sources/include/toonz/txshsoundlevel.h +++ b/toonz/sources/include/toonz/txshsoundlevel.h @@ -9,6 +9,7 @@ #include #include "tpersist.h" +#include "orientation.h" #undef DVAPI #undef DVVAR @@ -30,10 +31,11 @@ class DVAPI TXshSoundLevel final : public TXshLevel { int m_frameSoundCount; double m_fps; //! Values is a map of \b Integer and \b DoublePair. - /*!Integer is horizontal value of row pixel. + /*! Two maps, one for vertical layout and one for horizontal. +Integer is pixel number since start of sound. DoublePair is computed according to frameRate, frameCount -and soundtrack pressure.*/ - std::map m_values; +and soundtrack pressure. Means sound min and max.*/ + std::map m_values[Orientations::COUNT]; TFilePath m_path; @@ -60,9 +62,11 @@ public: void save() override; void save(const TFilePath &path); - void computeValues(int frameHeight = 20); + void computeValuesFor(const Orientation *o); + void computeValues(); - void getValueAtPixel(int pixel, DoublePair &values) const; + void getValueAtPixel(const Orientation *o, int pixel, + DoublePair &values) const; /*! Set frame rate to \b fps. \sa getSamplePerFrame() */ void setFrameRate(double fps); diff --git a/toonz/sources/include/toonzqt/dvdialog.h b/toonz/sources/include/toonzqt/dvdialog.h index 342296d..f83f118 100644 --- a/toonz/sources/include/toonzqt/dvdialog.h +++ b/toonz/sources/include/toonzqt/dvdialog.h @@ -173,6 +173,7 @@ class DVAPI Dialog : public QDialog { // If the dialog has button then is modal too. bool m_hasButton; QString m_name; + int m_currentScreen = -1; // gmt. rendo m_buttonLayout protected per ovviare ad un problema // sull'addButtonBarWidget(). cfr filebrowserpopup.cpp. // Dobbiamo discutere di Dialog. diff --git a/toonz/sources/include/toonzqt/flipconsole.h b/toonz/sources/include/toonzqt/flipconsole.h index cf9e412..def79e2 100644 --- a/toonz/sources/include/toonzqt/flipconsole.h +++ b/toonz/sources/include/toonzqt/flipconsole.h @@ -245,7 +245,7 @@ public: void getFrameRange(int &from, int &to, int &step) const { from = m_from, to = m_to, step = m_step; } - void setFrameRate(int rate); + void setFrameRate(int rate, bool forceUpdate = true); // if doShowHide==true, applies set visible, otherwise applies setEnabled void enableButton(UINT button, bool enable, bool doShowHide = true); void showCurrentFrame(); @@ -331,7 +331,7 @@ private: ImagePainter::VisualSettings m_settings; bool m_isPlay; - int m_fps; + int m_fps, m_sceneFps; bool m_reverse; int m_markerFrom, m_markerTo; bool m_drawBlanksEnabled; diff --git a/toonz/sources/include/toonzqt/flipconsoleowner.h b/toonz/sources/include/toonzqt/flipconsoleowner.h index 97e3546..b3eec23 100644 --- a/toonz/sources/include/toonzqt/flipconsoleowner.h +++ b/toonz/sources/include/toonzqt/flipconsoleowner.h @@ -18,8 +18,6 @@ public: virtual void onDrawFrame(int frame, const ImagePainter::VisualSettings &settings) = 0; - // return true if the frmae is in cache. reimplemented only in Flipbook - virtual bool isFrameAlreadyCached(int frame) { return true; }; virtual void swapBuffers(){}; virtual void changeSwapBehavior(bool enable){}; }; diff --git a/toonz/sources/include/toonzqt/gutil.h b/toonz/sources/include/toonzqt/gutil.h index 16d984d..c317333 100644 --- a/toonz/sources/include/toonzqt/gutil.h +++ b/toonz/sources/include/toonzqt/gutil.h @@ -120,12 +120,8 @@ bool DVAPI acceptResourceOrFolderDrop(const QList &urls); inline QPointF toQPointF(const TPointD &p) { return QPointF(p.x, p.y); } inline QPointF toQPointF(const TPoint &p) { return QPointF(p.x, p.y); } inline QPoint toQPoint(const TPoint &p) { return QPoint(p.x, p.y); } -inline TPointD toTPointD(const QPointF &p) { - return TPointD(p.x(), p.y()); -} -inline TPointD toTPointD(const QPoint &p) { - return TPointD(p.x(), p.y()); -} +inline TPointD toTPointD(const QPointF &p) { return TPointD(p.x(), p.y()); } +inline TPointD toTPointD(const QPoint &p) { return TPointD(p.x(), p.y()); } inline TPoint toTPoint(const QPoint &p) { return TPoint(p.x(), p.y()); } inline QRect toQRect(const TRect &r) { diff --git a/toonz/sources/include/toonzqt/spreadsheetviewer.h b/toonz/sources/include/toonzqt/spreadsheetviewer.h index 9e95be4..e49170b 100644 --- a/toonz/sources/include/toonzqt/spreadsheetviewer.h +++ b/toonz/sources/include/toonzqt/spreadsheetviewer.h @@ -4,6 +4,9 @@ #define SPREADSHEETVIEWER_H #include "tcommon.h" +#include "cellposition.h" +#include "toonz/cellpositionratio.h" +// #include "orientation.h" #include #include @@ -20,6 +23,7 @@ // forward declaration class TFrameHandle; class SpreadsheetViewer; +class Orientation; //------------------------------------------------------------------- @@ -30,23 +34,51 @@ class GenericPanel; //------------------------------------------------------------------- -class DVAPI FrameScroller { - QList m_connectedScrollers; +// Use composition rather than inheritance. +// How this works: +// * scroll area scrollbars sends event to this; +// * it notifies every other FrameScroller with difference; +// * they handle it by adjusting their scrollbars +class DVAPI FrameScroller final : public QObject { + Q_OBJECT + + const Orientation *m_orientation; + QScrollArea *m_scrollArea; + int m_lastX, m_lastY; + bool m_syncing; public: FrameScroller(); virtual ~FrameScroller(); - void connectScroller(FrameScroller *scroller); - void disconnectScroller(FrameScroller *scroller); - bool isScrollerConnected(FrameScroller *scroller); - virtual QScrollArea *getFrameScrollArea() const = 0; + void setFrameScrollArea(QScrollArea *scrollArea); + QScrollArea *getFrameScrollArea() const { return m_scrollArea; } + + void setOrientation(const Orientation *o) { m_orientation = o; } + const Orientation *orientation() const { return m_orientation; } void registerFrameScroller(); void unregisterFrameScroller(); - void prepareToScroll(int dy); - virtual void onPrepareToScroll(int dy) {} + void prepareToScrollOthers(const QPoint &offset); + + void setSyncing(bool s) { m_syncing = s; } + bool isSyncing() { return m_syncing; } + +private: + void connectScrollbars(); + void disconnectScrollbars(); + + void handleScroll(const QPoint &offset) const; + void onScroll(const CellPositionRatio &offset); + + void prepareToScrollRatio(const CellPositionRatio &offset); + +private slots: + void onVScroll(int value); + void onHScroll(int value); +signals: + void prepareToScrollOffset(const QPoint &offset); }; //------------------------------------------------------------------- @@ -190,8 +222,7 @@ protected: //------------------------------------------------------------------- -class DVAPI SpreadsheetViewer : public QFrame, - public Spreadsheet::FrameScroller { +class DVAPI SpreadsheetViewer : public QFrame { Q_OBJECT QColor m_lightLightBgColor; // RowPanel background (124,124,124) @@ -269,6 +300,10 @@ class DVAPI SpreadsheetViewer : public QFrame, int m_markRowDistance, m_markRowOffset; // QRect m_selectedCells; // x=col, y=row bool m_isComputingSize; + // const Orientation *m_orientation; + +protected: + Spreadsheet::FrameScroller m_frameScroller; public: SpreadsheetViewer(QWidget *parent); @@ -286,9 +321,6 @@ public: int getRowCount() const { return m_rowCount; } - // provvisorio - QScrollArea *getFrameScrollArea() const override { return m_cellScrollArea; } - // QProperty void setLightLightBGColor(const QColor &color) { m_lightLightBgColor = color; @@ -354,7 +386,6 @@ public: } void scroll(QPoint delta); - void onPrepareToScroll(int dy) override { refreshContentSize(0, dy); } void setAutoPanSpeed(const QPoint &speed); void setAutoPanSpeed(const QRect &widgetBounds, const QPoint &mousePos); @@ -368,6 +399,13 @@ public: int columnToX(int col) const; int rowToY(int row) const; + CellPosition xyToPosition(const QPoint &point) const; + QPoint positionToXY(const CellPosition &pos) const; + + CellRange xyRectToRange(const QRect &rect) const; + + // const Orientation *orientation () const { return m_orientation; } + bool refreshContentSize(int scrollDx, int scrollDy); int getCurrentRow() const { return m_currentRow; } @@ -413,6 +451,8 @@ public slots: void updateAreas(); void onVSliderChanged(int); void onHSliderChanged(int); + + void onPrepareToScrollOffset(const QPoint &offset); /* void updateAllAree(); void updateCellColumnAree(); diff --git a/toonz/sources/include/toonzqt/styleeditor.h b/toonz/sources/include/toonzqt/styleeditor.h index 8608ac7..cb22543 100644 --- a/toonz/sources/include/toonzqt/styleeditor.h +++ b/toonz/sources/include/toonzqt/styleeditor.h @@ -548,6 +548,9 @@ class SettingsPage final : public QScrollArea { bool m_updating; //!< Whether the page is copying style content to its widget, //! to be displayed. +private: + int getParamIndex(const QWidget *widget); + public: SettingsPage(QWidget *parent); @@ -565,6 +568,7 @@ private slots: void onAutofillChanged(); void onValueChanged(bool isDragging = false); + void onValueReset(); }; //============================================================================= @@ -614,6 +618,7 @@ class DVAPI StyleEditor final : public QWidget { StyleEditorPage *m_specialStylePage; StyleChooserPage *m_customStylePage; StyleChooserPage *m_vectorBrushesStylePage; + StyleChooserPage *m_mypaintBrushesStylePage; SettingsPage *m_settingsPage; TColorStyleP diff --git a/toonz/sources/include/tversion.h b/toonz/sources/include/tversion.h new file mode 100644 index 0000000..5bf7205 --- /dev/null +++ b/toonz/sources/include/tversion.h @@ -0,0 +1,57 @@ +#pragma once + +#ifndef TVER_INCLUDED +#define TVER_INCLUDED + +namespace TVER { + +class ToonzVersion { +public: + std::string getAppName(void); + float getAppVersion(void); + float getAppRevision(void); + std::string getAppVersionString(void); + std::string getAppRevisionString(void); + std::string getAppVersionInfo(std::string msg); + +private: + const char *applicationName = "OpenToonz"; + const float applicationVersion = 1.1; + const float applicationRevision = 3; +}; + +std::string ToonzVersion::getAppName(void) { + std::string appname = applicationName; + return appname; +} +float ToonzVersion::getAppVersion(void) { + float appver = applicationVersion; + return appver; +} +float ToonzVersion::getAppRevision(void) { + float apprev = applicationRevision; + return apprev; +} +std::string ToonzVersion::getAppVersionString(void) { + char buffer[50]; + sprintf(buffer, "%.1f", applicationVersion); + std::string appver = std::string(buffer); + return appver; +} +std::string ToonzVersion::getAppRevisionString(void) { + char buffer[50]; + sprintf(buffer, "%g", applicationRevision); + std::string apprev = std::string(buffer); + return apprev; +} +std::string ToonzVersion::getAppVersionInfo(std::string msg) { + std::string appinfo = std::string(applicationName); + appinfo += " " + msg + " v"; + appinfo += getAppVersionString(); + appinfo += "." + getAppRevisionString(); + return appinfo; +} + +} // namespace TVER + +#endif // TVER_INCLUDED diff --git a/toonz/sources/mousedragfilter/CMakeLists.txt b/toonz/sources/mousedragfilter/CMakeLists.txt index 5eeb0fd..d825b6c 100644 --- a/toonz/sources/mousedragfilter/CMakeLists.txt +++ b/toonz/sources/mousedragfilter/CMakeLists.txt @@ -3,7 +3,7 @@ if(BUILD_ENV_APPLE) project(MouseDragFilter) include_directories(.) - find_library(FOUNDATION_LIBRARY NAMES foundation) + find_library(FOUNDATION_LIBRARY NAMES Foundation) find_library(CG_LIBRARY NAMES CoreGraphics) add_library(mousedragfilter mousedragfilter.mm mousedragfilter.h) target_link_libraries(mousedragfilter ${CG_LIBRARY} ${FOUNDATION_LIBRARY}) diff --git a/toonz/sources/tcomposer/tcomposer.cpp b/toonz/sources/tcomposer/tcomposer.cpp index 1eb9d32..5819453 100644 --- a/toonz/sources/tcomposer/tcomposer.cpp +++ b/toonz/sources/tcomposer/tcomposer.cpp @@ -85,7 +85,7 @@ typedef QualifierT FilePathQualifier; namespace { double currentCameraSize = 12; double getCurrentCameraSize() { return currentCameraSize; } -} +} // namespace //======================================================================== // @@ -223,7 +223,7 @@ void tcomposerRunOutOfContMemHandler(unsigned long size) { TImageCache::instance()->clear(true); exit(2); } -} +} // namespace //============================================================================================== @@ -403,7 +403,7 @@ static std::pair generateMovie(ToonzScene *scene, const TFilePath &fp, r0 = r0 - 1; r1 = r1 - 1; - if (r0 < 0) r0 = 0; + if (r0 < 0) r0 = 0; if (r1 < 0 || r1 >= scene->getFrameCount()) r1 = scene->getFrameCount() - 1; string msg; assert(r1 >= r0); @@ -557,6 +557,9 @@ static std::pair generateMovie(ToonzScene *scene, const TFilePath &fp, // TODO: il main comincia a diventare troppo lungo. Forse val la pena // separarlo in varie funzioni // (tipo initToonzEnvironment(), parseCommandLine(), ecc) +// TODO: the main starts getting too long. Perhaps it is worth +// separated into various functions +// (type initToonzEnvironment (), ParseCommandLine (), etc.) DV_IMPORT_API void initStdFx(); DV_IMPORT_API void initColorFx(); @@ -658,8 +661,8 @@ int main(int argc, char *argv[]) { TVectorBrushStyle::setRootDir(libraryFolder); TPalette::setRootDir(libraryFolder); TImageStyle::setLibraryDir(libraryFolder); - TFilePath cacheRoot = ToonzFolder::getCacheRootFolder(); - if (cacheRoot.isEmpty()) cacheRoot = TEnv::getStuffDir() + "cache"; + TFilePath cacheRoot = ToonzFolder::getCacheRootFolder(); + if (cacheRoot.isEmpty()) cacheRoot= TEnv::getStuffDir() + "cache"; TImageCache::instance()->setRootDir(cacheRoot); // #endif @@ -944,8 +947,8 @@ int main(int argc, char *argv[]) { DVGui::info(QString::fromStdString(msg)); TImageCache::instance()->clear(true); } catch (TException &e) { - msg = "Untrapped exception: " + ::to_string(e.getMessage()), cout << msg - << endl; + msg = "Untrapped exception: " + ::to_string(e.getMessage()), + cout << msg << endl; m_userLog->error(msg); TImageCache::instance()->clear(true); } catch (...) { diff --git a/toonz/sources/tnzcore/CMakeLists.txt b/toonz/sources/tnzcore/CMakeLists.txt index 8b605b7..76bf389 100644 --- a/toonz/sources/tnzcore/CMakeLists.txt +++ b/toonz/sources/tnzcore/CMakeLists.txt @@ -120,6 +120,7 @@ set(HEADERS ${MOC_HEADERS} ../include/tenv.h ../include/tmeshimage.h ../include/tgldisplaylistsmanager.h + ../include/tversion.h ) set(SOURCES diff --git a/toonz/sources/tnztools/CMakeLists.txt b/toonz/sources/tnztools/CMakeLists.txt index 4fd4c19..172a11a 100644 --- a/toonz/sources/tnztools/CMakeLists.txt +++ b/toonz/sources/tnztools/CMakeLists.txt @@ -33,6 +33,7 @@ set(HEADERS ${MOC_HEADERS} ../include/tools/toolcommandids.h ../include/tools/toolutils.h ../include/tools/RGBpicker.h + mypainttoonzbrush.h ) set(SOURCES @@ -92,6 +93,7 @@ set(SOURCES screenpicker.cpp fingertool.cpp rulertool.cpp + mypainttoonzbrush.cpp ) set(RESOURCES tnztools.qrc) @@ -124,4 +126,4 @@ include_directories( _find_toonz_library(EXTRA_LIBS "tnzcore;tnzbase;tnzext;toonzlib;toonzqt") -target_link_libraries(tnztools Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network Qt5::OpenGL ${GLUT_LIB} ${EXTRA_LIBS} ${GL_LIB}) +target_link_libraries(tnztools Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network Qt5::OpenGL ${GLUT_LIB} ${EXTRA_LIBS} ${GL_LIB} ${MYPAINT_LIB_LDFLAGS}) diff --git a/toonz/sources/tnztools/brushtool.cpp b/toonz/sources/tnztools/brushtool.cpp index ab9b4c5..1cb08c7 100644 --- a/toonz/sources/tnztools/brushtool.cpp +++ b/toonz/sources/tnztools/brushtool.cpp @@ -2005,7 +2005,10 @@ BrushData::BrushData() , m_pressure(false) , m_cap(0) , m_join(0) - , m_miter(0) {} + , m_miter(0) + , m_modifierSize(0.0) + , m_modifierOpacity(0.0) + {} //---------------------------------------------------------------------------------------------------------- @@ -2024,7 +2027,10 @@ BrushData::BrushData(const std::wstring &name) , m_pressure(false) , m_cap(0) , m_join(0) - , m_miter(0) {} + , m_miter(0) + , m_modifierSize(0.0) + , m_modifierOpacity(0.0) + {} //---------------------------------------------------------------------------------------------------------- @@ -2068,6 +2074,12 @@ void BrushData::saveData(TOStream &os) { os.openChild("Miter"); os << m_miter; os.closeChild(); + os.openChild("Modifier_Size"); + os << m_modifierSize; + os.closeChild(); + os.openChild("Modifier_Opacity"); + os << m_modifierOpacity; + os.closeChild(); } //---------------------------------------------------------------------------------------------------------- @@ -2103,6 +2115,10 @@ void BrushData::loadData(TIStream &is) { is >> m_join, is.matchEndTag(); else if (tagName == "Miter") is >> m_miter, is.matchEndTag(); + else if (tagName == "Modifier_Size") + is >> m_modifierSize, is.matchEndTag(); + else if (tagName == "Modifier_Opacity") + is >> m_modifierOpacity, is.matchEndTag(); else is.skipCurrentTag(); } diff --git a/toonz/sources/tnztools/brushtool.h b/toonz/sources/tnztools/brushtool.h index 3a87f8e..03765ed 100644 --- a/toonz/sources/tnztools/brushtool.h +++ b/toonz/sources/tnztools/brushtool.h @@ -38,6 +38,7 @@ struct BrushData final : public TPersist { double m_min, m_max, m_acc, m_smooth, m_hardness, m_opacityMin, m_opacityMax; bool m_selective, m_pencil, m_breakAngles, m_pressure; int m_cap, m_join, m_miter; + double m_modifierSize, m_modifierOpacity; BrushData(); BrushData(const std::wstring &name); diff --git a/toonz/sources/tnztools/fullcolorbrushtool.cpp b/toonz/sources/tnztools/fullcolorbrushtool.cpp index ac7841d..127019d 100644 --- a/toonz/sources/tnztools/fullcolorbrushtool.cpp +++ b/toonz/sources/tnztools/fullcolorbrushtool.cpp @@ -9,7 +9,7 @@ #include "tools/toolhandle.h" #include "tools/tooloptions.h" -#include "bluredbrush.h" +#include "mypainttoonzbrush.h" // TnzQt includes #include "toonzqt/dvdialog.h" @@ -24,6 +24,7 @@ #include "toonz/strokegenerator.h" #include "toonz/tstageobject.h" #include "toonz/palettecontroller.h" +#include "toonz/mypaintbrushstyle.h" // TnzCore includes #include "tgl.h" @@ -35,6 +36,7 @@ #include "tstream.h" #include "tstroke.h" #include "timagecache.h" +#include "tpixelutils.h" // Qt includes #include // Qt translation support @@ -47,6 +49,8 @@ TEnv::IntVar FullcolorPressureSensitivity("FullcolorPressureSensitivity", 1); TEnv::DoubleVar FullcolorBrushHardness("FullcolorBrushHardness", 100); TEnv::DoubleVar FullcolorMinOpacity("FullcolorMinOpacity", 100); TEnv::DoubleVar FullcolorMaxOpacity("FullcolorMaxOpacity", 100); +TEnv::DoubleVar FullcolorModifierSize("FullcolorModifierSize", 0); +TEnv::DoubleVar FullcolorModifierOpacity("FullcolorModifierOpacity", 100); //---------------------------------------------------------------------------------- @@ -56,31 +60,6 @@ TEnv::DoubleVar FullcolorMaxOpacity("FullcolorMaxOpacity", 100); namespace { -int computeThickness(int pressure, const TIntPairProperty &property, - bool isPath = false) { - if (isPath) return 0.0; - double p = pressure / 255.0; - double t = p * p * p; - int thick0 = property.getValue().first; - int thick1 = property.getValue().second; - return tround(thick0 + (thick1 - thick0) * t); -} - -//---------------------------------------------------------------------------------- - -double computeThickness(int pressure, const TDoublePairProperty &property, - bool isPath = false) { - if (isPath) return 0.0; - double p = pressure / 255.0; - double t = p * p * p; - double thick0 = property.getValue().first; - double thick1 = property.getValue().second; - if (thick1 < 0.0001) thick0 = thick1 = 0.0; - return (thick0 + (thick1 - thick0) * t); -} - -//---------------------------------------------------------------------------------- - class FullColorBrushUndo final : public ToolUtils::TFullColorRasterUndo { TPoint m_offset; QString m_id; @@ -134,10 +113,13 @@ FullColorBrushTool::FullColorBrushTool(std::string name) , m_pressure("Pressure", true) , m_opacity("Opacity", 0, 100, 100, 100, true) , m_hardness("Hardness:", 0, 100, 100) + , m_modifierSize("ModifierSize", -3, 3, 0, true) + , m_modifierOpacity("ModifierOpacity", 0, 100, 100, true) , m_preset("Preset:") - , m_styleId(0) - , m_oldOpacity(1) - , m_brush(0) + , m_minCursorThick(0) + , m_maxCursorThick(0) + , m_enabledPressure(false) + , m_toonz_brush(0) , m_tileSet(0) , m_tileSaver(0) , m_notifier(0) @@ -148,9 +130,14 @@ FullColorBrushTool::FullColorBrushTool(std::string name) m_prop.bind(m_thickness); m_prop.bind(m_hardness); m_prop.bind(m_opacity); + m_prop.bind(m_modifierSize); + m_prop.bind(m_modifierOpacity); m_prop.bind(m_pressure); m_prop.bind(m_preset); + m_preset.setId("BrushPreset"); + + m_brushTimer.start(); } //--------------------------------------------------------------------------------------------------- @@ -171,12 +158,20 @@ void FullColorBrushTool::onCanvasSizeChanged() { //--------------------------------------------------------------------------------------------------- +void FullColorBrushTool::onColorStyleChanged() { + getApplication()->getCurrentTool()->notifyToolChanged(); +} + +//--------------------------------------------------------------------------------------------------- + void FullColorBrushTool::updateTranslation() { m_thickness.setQStringName(tr("Size")); m_pressure.setQStringName(tr("Pressure")); m_opacity.setQStringName(tr("Opacity")); m_hardness.setQStringName(tr("Hardness:")); m_preset.setQStringName(tr("Preset:")); + m_modifierSize.setQStringName(tr("Size")); + m_modifierOpacity.setQStringName(tr("Opacity")); } //--------------------------------------------------------------------------------------------------- @@ -184,7 +179,7 @@ void FullColorBrushTool::updateTranslation() { void FullColorBrushTool::onActivate() { if (!m_notifier) m_notifier = new FullColorBrushToolNotifier(this); - updateCurrentColor(); + updateCurrentStyle(); if (m_firstTime) { m_firstTime = false; @@ -194,11 +189,12 @@ void FullColorBrushTool::onActivate() { m_opacity.setValue( TDoublePairProperty::Value(FullcolorMinOpacity, FullcolorMaxOpacity)); m_hardness.setValue(FullcolorBrushHardness); + m_modifierSize.setValue(FullcolorModifierSize); + m_modifierOpacity.setValue(FullcolorModifierOpacity); } - m_brushPad = ToolUtils::getBrushPad(m_thickness.getValue().second, - m_hardness.getValue() * 0.01); setWorkAndBackupImages(); + onColorStyleChanged(); } //-------------------------------------------------------------------------------------------------- @@ -212,27 +208,64 @@ void FullColorBrushTool::onDeactivate() { //-------------------------------------------------------------------------------------------------- void FullColorBrushTool::updateWorkAndBackupRasters(const TRect &rect) { + if (rect.isEmpty()) return; + TRasterImageP ri = TImageP(getImage(false, 1)); if (!ri) return; TRasterP ras = ri->getRaster(); - TRect _rect = rect * ras->getBounds(); - TRect _lastRect = m_lastRect * ras->getBounds(); - - if (_rect.isEmpty()) return; + const int denominator = 8; + TRect enlargedRect = rect + m_lastRect; + int dx = (enlargedRect.getLx()-1)/denominator+1; + int dy = (enlargedRect.getLy()-1)/denominator+1; if (m_lastRect.isEmpty()) { - m_workRaster->extract(_rect)->clear(); + enlargedRect.x0 -= dx; + enlargedRect.y0 -= dy; + enlargedRect.x1 += dx; + enlargedRect.y1 += dy; + + TRect _rect = enlargedRect*ras->getBounds(); + if (_rect.isEmpty()) return; + + m_workRaster->extract(_rect)->copy(ras->extract(_rect)); m_backUpRas->extract(_rect)->copy(ras->extract(_rect)); - return; + } else { + if (enlargedRect.x0 < m_lastRect.x0) enlargedRect.x0 -= dx; + if (enlargedRect.y0 < m_lastRect.y0) enlargedRect.y0 -= dy; + if (enlargedRect.x1 > m_lastRect.x1) enlargedRect.x1 += dx; + if (enlargedRect.y1 > m_lastRect.y1) enlargedRect.y1 += dy; + + TRect _rect = enlargedRect*ras->getBounds(); + if (_rect.isEmpty()) return; + + TRect _lastRect = m_lastRect * ras->getBounds(); + QList rects = ToolUtils::splitRect(_rect, _lastRect); + for (int i = 0; i < rects.size(); i++) { + m_workRaster->extract(rects[i])->copy(ras->extract(rects[i])); + m_backUpRas->extract(rects[i])->copy(ras->extract(rects[i])); + } } - QList rects = ToolUtils::splitRect(_rect, _lastRect); - for (int i = 0; i < rects.size(); i++) { - m_workRaster->extract(rects[i])->clear(); - m_backUpRas->extract(rects[i])->copy(ras->extract(rects[i])); - } + m_lastRect = enlargedRect; +} + +//-------------------------------------------------------------------------------------------------- + +bool FullColorBrushTool::askRead(const TRect &rect) { + return askWrite(rect); +} + +//-------------------------------------------------------------------------------------------------- + +bool FullColorBrushTool::askWrite(const TRect &rect) { + if (rect.isEmpty()) return true; + m_strokeRect += rect; + m_strokeSegmentRect += rect; + updateWorkAndBackupRasters(rect); + m_tileSaver->save(rect); + return true; } //-------------------------------------------------------------------------------------------------- @@ -249,6 +282,7 @@ bool FullColorBrushTool::preLeftButtonDown() { void FullColorBrushTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { + TPointD previousBrushPos = m_brushPos; m_brushPos = m_mousePos = pos; m_mousePressed = true; m_mouseEvent = e; @@ -262,155 +296,102 @@ void FullColorBrushTool::leftButtonDown(const TPointD &pos, /* update color here since the current style might be switched with numpad * shortcut keys */ - updateCurrentColor(); + updateCurrentStyle(); - TRasterP ras = ri->getRaster(); - TDimension dim = ras->getSize(); + TRasterP ras = ri->getRaster(); if (!(m_workRaster && m_backUpRas)) setWorkAndBackupImages(); m_workRaster->lock(); - double maxThick = m_thickness.getValue().second; - double thickness = m_pressure.getValue() - ? computeThickness(e.m_pressure, m_thickness) - : maxThick; - double opacity = - (m_pressure.getValue() ? computeThickness(e.m_pressure, m_opacity) - : m_opacity.getValue().second) * - 0.01; - TPointD rasCenter = TPointD(dim.lx * 0.5, dim.ly * 0.5); - TThickPoint point(pos + rasCenter, thickness); - TPointD halfThick(maxThick * 0.5, maxThick * 0.5); - TRectD invalidateRect(pos - halfThick, pos + halfThick); - - m_points.clear(); - m_points.push_back(point); + TPointD rasCenter = ras->getCenterD(); + TPointD point(pos + rasCenter); + double pressure = m_enabledPressure && e.isTablet() ? e.m_pressure/255.0 : 0.5; m_tileSet = new TTileSetFullColor(ras->getSize()); m_tileSaver = new TTileSaverFullColor(ras, m_tileSet); - double hardness = m_hardness.getValue() * 0.01; - - m_brush = - new BluredBrush(m_workRaster, maxThick, m_brushPad, hardness == 1.0); - m_strokeRect = m_brush->getBoundFromPoints(m_points); - updateWorkAndBackupRasters(m_strokeRect); - m_tileSaver->save(m_strokeRect); - m_brush->addPoint(point, opacity); - m_brush->updateDrawing(ras, m_backUpRas, m_currentColor, m_strokeRect, - m_opacity.getValue().second * 0.01); - m_oldOpacity = opacity; - m_lastRect = m_strokeRect; - - invalidate(invalidateRect.enlarge(2)); + + mypaint::Brush mypaintBrush; + applyToonzBrushSettings(mypaintBrush); + m_toonz_brush = new MyPaintToonzBrush(m_workRaster, *this, mypaintBrush); + + m_strokeRect.empty(); + m_strokeSegmentRect.empty(); + m_toonz_brush->beginStroke(); + m_toonz_brush->strokeTo(point, pressure, restartBrushTimer()); + TRect updateRect = m_strokeSegmentRect*ras->getBounds(); + if (!updateRect.isEmpty()) + ras->extract(updateRect)->copy(m_workRaster->extract(updateRect)); + + TPointD thickOffset(m_maxCursorThick*0.5, m_maxCursorThick*0.5); + TRectD invalidateRect = convert(m_strokeSegmentRect) - rasCenter; + invalidateRect += TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset); + invalidateRect += TRectD(previousBrushPos - thickOffset, previousBrushPos + thickOffset); + invalidate(invalidateRect.enlarge(2.0)); } //------------------------------------------------------------------------------------------------------------- void FullColorBrushTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) { + TPointD previousBrushPos = m_brushPos; m_brushPos = m_mousePos = pos; m_mouseEvent = e; TRasterImageP ri = (TRasterImageP)getImage(true); if (!ri) return; - double maxThickness = m_thickness.getValue().second; - double thickness = m_pressure.getValue() - ? computeThickness(e.m_pressure, m_thickness) - : maxThickness; - double opacity = - (m_pressure.getValue() ? computeThickness(e.m_pressure, m_opacity) - : m_opacity.getValue().second) * - 0.01; - TDimension size = m_workRaster->getSize(); - TPointD rasCenter = TPointD(size.lx * 0.5, size.ly * 0.5); - TThickPoint point(pos + rasCenter, thickness); - - TThickPoint old = m_points.back(); - if (norm2(point - old) < 4) return; - - TThickPoint mid((old + point) * 0.5, (point.thick + old.thick) * 0.5); - m_points.push_back(mid); - m_points.push_back(point); - - TRect bbox; - int m = m_points.size(); - TRectD invalidateRect; - if (m == 3) { - // ho appena cominciato. devo disegnare un segmento - TThickPoint pa = m_points.front(); - std::vector points; - points.push_back(pa); - points.push_back(mid); - invalidateRect = ToolUtils::getBounds(points, maxThickness); - bbox = m_brush->getBoundFromPoints(points); - updateWorkAndBackupRasters(bbox + m_lastRect); - m_tileSaver->save(bbox); - m_brush->addArc(pa, (pa + mid) * 0.5, mid, m_oldOpacity, opacity); - m_lastRect += bbox; - } else { - // caso generale: disegno un arco - std::vector points; - points.push_back(m_points[m - 4]); - points.push_back(old); - points.push_back(mid); - invalidateRect = ToolUtils::getBounds(points, maxThickness); - bbox = m_brush->getBoundFromPoints(points); - updateWorkAndBackupRasters(bbox + m_lastRect); - m_tileSaver->save(bbox); - m_brush->addArc(m_points[m - 4], old, mid, m_oldOpacity, opacity); - m_lastRect += bbox; - } - m_oldOpacity = opacity; - m_brush->updateDrawing(ri->getRaster(), m_backUpRas, m_currentColor, bbox, - m_opacity.getValue().second * 0.01); - invalidate(invalidateRect.enlarge(2) - rasCenter); - m_strokeRect += bbox; + TRasterP ras = ri->getRaster(); + TPointD rasCenter = ras->getCenterD(); + TPointD point(pos + rasCenter); + double pressure = m_enabledPressure && e.isTablet() ? e.m_pressure/255.0 : 0.5; + + m_strokeSegmentRect.empty(); + m_toonz_brush->strokeTo(point, pressure, restartBrushTimer()); + TRect updateRect = m_strokeSegmentRect*ras->getBounds(); + if (!updateRect.isEmpty()) + ras->extract(updateRect)->copy(m_workRaster->extract(updateRect)); + + TPointD thickOffset(m_maxCursorThick*0.5, m_maxCursorThick*0.5); + TRectD invalidateRect = convert(m_strokeSegmentRect) - rasCenter; + invalidateRect += TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset); + invalidateRect += TRectD(previousBrushPos - thickOffset, previousBrushPos + thickOffset); + invalidate(invalidateRect.enlarge(2.0)); } //--------------------------------------------------------------------------------------------------------------- void FullColorBrushTool::leftButtonUp(const TPointD &pos, const TMouseEvent &e) { + TPointD previousBrushPos = m_brushPos; m_brushPos = m_mousePos = pos; TRasterImageP ri = (TRasterImageP)getImage(true); if (!ri) return; - if (m_points.size() != 1) { - double maxThickness = m_thickness.getValue().second; - double thickness = m_pressure.getValue() - ? computeThickness(e.m_pressure, m_thickness) - : maxThickness; - double opacity = - (m_pressure.getValue() ? computeThickness(e.m_pressure, m_opacity) - : m_opacity.getValue().second) * - 0.01; - TPointD rasCenter = ri->getRaster()->getCenterD(); - TThickPoint point(pos + rasCenter, thickness); - m_points.push_back(point); - int m = m_points.size(); - std::vector points; - points.push_back(m_points[m - 3]); - points.push_back(m_points[m - 2]); - points.push_back(m_points[m - 1]); - TRect bbox = m_brush->getBoundFromPoints(points); - updateWorkAndBackupRasters(bbox); - m_tileSaver->save(bbox); - m_brush->addArc(points[0], points[1], points[2], m_oldOpacity, opacity); - m_brush->updateDrawing(ri->getRaster(), m_backUpRas, m_currentColor, bbox, - m_opacity.getValue().second * 0.01); - TRectD invalidateRect = ToolUtils::getBounds(points, maxThickness); - invalidate(invalidateRect.enlarge(2) - rasCenter); - m_strokeRect += bbox; - m_lastRect.empty(); - } - - if (m_brush) { - delete m_brush; - m_brush = 0; + TRasterP ras = ri->getRaster(); + TPointD rasCenter = ras->getCenterD(); + TPointD point(pos + rasCenter); + double pressure = m_enabledPressure && e.isTablet() ? e.m_pressure/255.0 : 0.5; + + m_strokeSegmentRect.empty(); + m_toonz_brush->strokeTo(point, pressure, restartBrushTimer()); + m_toonz_brush->endStroke(); + TRect updateRect = m_strokeSegmentRect*ras->getBounds(); + if (!updateRect.isEmpty()) + ras->extract(updateRect)->copy(m_workRaster->extract(updateRect)); + + TPointD thickOffset(m_maxCursorThick*0.5, m_maxCursorThick*0.5); + TRectD invalidateRect = convert(m_strokeSegmentRect) - rasCenter; + invalidateRect += TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset); + invalidateRect += TRectD(previousBrushPos - thickOffset, previousBrushPos + thickOffset); + invalidate(invalidateRect.enlarge(2.0)); + + if (m_toonz_brush) { + delete m_toonz_brush; + m_toonz_brush = 0; } + m_lastRect.empty(); m_workRaster->unlock(); if (m_tileSet->getTileCount() > 0) { @@ -419,10 +400,10 @@ void FullColorBrushTool::leftButtonUp(const TPointD &pos, TXshLevel *level = app->getCurrentLevel()->getLevel(); TXshSimpleLevelP simLevel = level->getSimpleLevel(); TFrameId frameId = getCurrentFid(); - TRasterP ras = ri->getRaster()->extract(m_strokeRect)->clone(); + TRasterP subras = ras->extract(m_strokeRect)->clone(); TUndoManager::manager()->add( new FullColorBrushUndo(m_tileSet, simLevel.getPointer(), frameId, - m_isFrameCreated, ras, m_strokeRect.getP00())); + m_isFrameCreated, subras, m_strokeRect.getP00())); } notifyImageChanged(); @@ -497,41 +478,54 @@ void FullColorBrushTool::draw() { if (TRasterImageP ri = TRasterImageP(getImage(false))) { TRasterP ras = ri->getRaster(); - glColor3d(1.0, 0.0, 0.0); + double alpha = 1.0; + double alphaRadius = 3.0; + double pixelSize = sqrt(tglGetPixelSize2()); + + // circles with lesser radius looks more bold + // to avoid these effect we'll reduce alpha for small radiuses + double minX = m_minCursorThick/(alphaRadius*pixelSize); + double maxX = m_maxCursorThick/(alphaRadius*pixelSize); + double minAlpha = alpha*(1.0 - 1.0/(1.0 + minX)); + double maxAlpha = alpha*(1.0 - 1.0/(1.0 + maxX)); + + glPushAttrib(GL_ALL_ATTRIB_BITS); + tglEnableBlending(); + tglEnableLineSmooth(true, 0.5); + + if (m_minCursorThick < m_maxCursorThick - pixelSize) { + glColor4d(1.0, 1.0, 1.0, minAlpha); + tglDrawCircle(m_brushPos, (m_minCursorThick + 1)*0.5 - pixelSize); + glColor4d(0.0, 0.0, 0.0, minAlpha); + tglDrawCircle(m_brushPos, (m_minCursorThick + 1)*0.5); + } + + glColor4d(1.0, 1.0, 1.0, maxAlpha); + tglDrawCircle(m_brushPos, (m_maxCursorThick + 1)*0.5 - pixelSize); + glColor4d(0.0, 0.0, 0.0, maxAlpha); + tglDrawCircle(m_brushPos, (m_maxCursorThick + 1)*0.5); - tglDrawCircle(m_brushPos, (m_minThick + 1) * 0.5); - tglDrawCircle(m_brushPos, (m_maxThick + 1) * 0.5); + glPopAttrib(); } } //-------------------------------------------------------------------------------------------------------------- void FullColorBrushTool::onEnter() { - TImageP img = getImage(false); - TRasterImageP ri(img); - if (ri) { - m_minThick = m_thickness.getValue().first; - m_maxThick = m_thickness.getValue().second; - } else { - m_minThick = 0; - m_maxThick = 0; - } - - updateCurrentColor(); + updateCurrentStyle(); } //---------------------------------------------------------------------------------------------------------- void FullColorBrushTool::onLeave() { - m_minThick = 0; - m_maxThick = 0; + m_minCursorThick = 0; + m_maxCursorThick = 0; } //---------------------------------------------------------------------------------------------------------- TPropertyGroup *FullColorBrushTool::getProperties(int targetType) { if (!m_presetsLoaded) initPresets(); - return &m_prop; } @@ -564,24 +558,16 @@ void FullColorBrushTool::setWorkAndBackupImages() { //------------------------------------------------------------------ bool FullColorBrushTool::onPropertyChanged(std::string propertyName) { - m_minThick = m_thickness.getValue().first; - m_maxThick = m_thickness.getValue().second; - if (propertyName == "Hardness:" || propertyName == "Thickness" || - propertyName == "Size") { - m_brushPad = ToolUtils::getBrushPad(m_thickness.getValue().second, - m_hardness.getValue() * 0.01); - TRectD rect(m_brushPos - TPointD(m_maxThick + 2, m_maxThick + 2), - m_brushPos + TPointD(m_maxThick + 2, m_maxThick + 2)); - invalidate(rect); - } - /*if(propertyName == "Hardness:" || propertyName == "Opacity:") -setWorkAndBackupImages();*/ - FullcolorBrushMinSize = m_minThick; - FullcolorBrushMaxSize = m_maxThick; + FullcolorBrushMinSize = m_thickness.getValue().first; + FullcolorBrushMaxSize = m_thickness.getValue().second; FullcolorPressureSensitivity = m_pressure.getValue(); FullcolorBrushHardness = m_hardness.getValue(); FullcolorMinOpacity = m_opacity.getValue().first; FullcolorMaxOpacity = m_opacity.getValue().second; + FullcolorModifierSize = m_modifierSize.getValue(); + FullcolorModifierOpacity = m_modifierOpacity.getValue(); + + updateCurrentStyle(); if (propertyName == "Preset:") { loadPreset(); @@ -631,11 +617,12 @@ void FullColorBrushTool::loadPreset() { { m_thickness.setValue( TIntPairProperty::Value(std::max((int)preset.m_min, 1), preset.m_max)); - m_brushPad = ToolUtils::getBrushPad(preset.m_max, preset.m_hardness * 0.01); m_hardness.setValue(preset.m_hardness, true); m_opacity.setValue( TDoublePairProperty::Value(preset.m_opacityMin, preset.m_opacityMax)); m_pressure.setValue(preset.m_pressure); + m_modifierSize.setValue(preset.m_modifierSize); + m_modifierOpacity.setValue(preset.m_modifierOpacity); } catch (...) { } } @@ -646,12 +633,14 @@ void FullColorBrushTool::addPreset(QString name) { // Build the preset BrushData preset(name.toStdWString()); - preset.m_min = m_thickness.getValue().first; - preset.m_max = m_thickness.getValue().second; - preset.m_hardness = m_hardness.getValue(); - preset.m_opacityMin = m_opacity.getValue().first; - preset.m_opacityMax = m_opacity.getValue().second; - preset.m_pressure = m_pressure.getValue(); + preset.m_min = m_thickness.getValue().first; + preset.m_max = m_thickness.getValue().second; + preset.m_hardness = m_hardness.getValue(); + preset.m_opacityMin = m_opacity.getValue().first; + preset.m_opacityMax = m_opacity.getValue().second; + preset.m_pressure = m_pressure.getValue(); + preset.m_modifierSize = m_modifierSize.getValue(); + preset.m_modifierOpacity = m_modifierOpacity.getValue(); // Pass the preset to the manager m_presetsManager.addPreset(preset); @@ -678,32 +667,209 @@ void FullColorBrushTool::removePreset() { //------------------------------------------------------------------ -void FullColorBrushTool::updateCurrentColor() { - TTool::Application *app = getApplication(); - if (app->getCurrentObject()->isSpline()) { - m_currentColor = TPixel32::Red; - return; +void FullColorBrushTool::updateCurrentStyle() { + m_currentColor = TPixel32::Black; + if (TTool::Application *app = getApplication()) { + if (app->getCurrentObject()->isSpline()) { + m_currentColor = TPixel32::Red; + } else + if (TPalette *plt = app->getCurrentPalette()->getPalette()) { + int style = app->getCurrentLevelStyleIndex(); + TColorStyle *colorStyle = plt->getStyle(style); + m_currentColor = colorStyle->getMainColor(); + } } - TPalette *plt = app->getCurrentPalette()->getPalette(); - if (!plt) return; - int style = app->getCurrentLevelStyleIndex(); - TColorStyle *colorStyle = plt->getStyle(style); - m_currentColor = colorStyle->getMainColor(); + int prevMinCursorThick = m_minCursorThick; + int prevMaxCursorThick = m_maxCursorThick; + + m_enabledPressure = m_pressure.getValue(); + if (TMyPaintBrushStyle *brushStyle = getBrushStyle()) { + double radiusLog = brushStyle->getBrush().getBaseValue(MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC) + + m_modifierSize.getValue()*log(2.0); + double radius = exp(radiusLog); + m_minCursorThick = m_maxCursorThick = (int)round(2.0*radius); + } else { + m_minCursorThick = std::max(m_thickness.getValue().first, 1); + m_maxCursorThick = std::max(m_thickness.getValue().second, m_minCursorThick); + if (!m_enabledPressure) { + double minRadiusLog = log(0.5*m_minCursorThick); + double maxRadiusLog = log(0.5*m_maxCursorThick); + double avgRadiusLog = 0.5*(minRadiusLog + maxRadiusLog); + double avgRadius = exp(avgRadiusLog); + m_minCursorThick = m_maxCursorThick = (int)round(2.0*avgRadius); + } + } + + if (m_minCursorThick != prevMinCursorThick || m_maxCursorThick != prevMaxCursorThick) { + TRectD rect(m_brushPos - TPointD(m_maxCursorThick + 2, m_maxCursorThick + 2), + m_brushPos + TPointD(m_maxCursorThick + 2, m_maxCursorThick + 2)); + invalidate(rect); + } +} + +//------------------------------------------------------------------ + +double FullColorBrushTool::restartBrushTimer() { + double dtime = m_brushTimer.nsecsElapsed()*1e-9; + m_brushTimer.restart(); + return dtime; +} + +//------------------------------------------------------------------ + +TMyPaintBrushStyle* FullColorBrushTool::getBrushStyle() { + if (TTool::Application *app = getApplication()) + return dynamic_cast( app->getCurrentLevelStyle() ); + return 0; } +//------------------------------------------------------------------ + +void FullColorBrushTool::applyClassicToonzBrushSettings(mypaint::Brush &mypaintBrush) { + const double precision = 1e-5; + const double hardnessOpacity = 0.1; + + double minThickness = 0.5*m_thickness.getValue().first; + double maxThickness = 0.5*m_thickness.getValue().second; + double minOpacity = 0.01*m_opacity.getValue().first; + double maxOpacity = 0.01*m_opacity.getValue().second; + double hardness = 0.01*m_hardness.getValue(); + + TPixelD color = PixelConverter::from(m_currentColor); + double colorH = 0.0; + double colorS = 0.0; + double colorV = 0.0; + RGB2HSV(color.r, color.g, color.b, &colorH, &colorS, &colorV); + + // avoid log(0) + if (minThickness < precision) + minThickness = precision; + if (maxThickness < precision) + maxThickness = precision; + + // tune hardness opacity for better visual softness + hardness *= hardness; + double opacityAmplifier = 1.0 - hardnessOpacity + hardness*hardnessOpacity; + minOpacity *= opacityAmplifier; + maxOpacity *= opacityAmplifier; + + // reset + mypaintBrush.fromDefaults(); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_OPAQUE_MULTIPLY, 1.0); + mypaintBrush.setMappingN( + MYPAINT_BRUSH_SETTING_OPAQUE_MULTIPLY, + MYPAINT_BRUSH_INPUT_PRESSURE, + 0 ); + + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_HARDNESS, 0.5*hardness + 0.5); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_COLOR_H, colorH/360.0); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_COLOR_S, colorS); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_COLOR_V, colorV); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_DABS_PER_ACTUAL_RADIUS, 5.0 + hardness*10.0); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_DABS_PER_BASIC_RADIUS, 0.0); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_DABS_PER_SECOND, 0.0); + + // thickness may be dynamic + if (minThickness + precision >= maxThickness) { + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, log(maxThickness)); + mypaintBrush.setMappingN( + MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, + MYPAINT_BRUSH_INPUT_PRESSURE, + 0 ); + } else { + double minThicknessLog = log(minThickness); + double maxThicknessLog = log(maxThickness); + double baseThicknessLog = 0.5*(minThicknessLog + maxThicknessLog); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, baseThicknessLog); + mypaintBrush.setMappingN( + MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, + MYPAINT_BRUSH_INPUT_PRESSURE, + 2 ); + mypaintBrush.setMappingPoint( + MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, + MYPAINT_BRUSH_INPUT_PRESSURE, + 0, 0.0, minThicknessLog - baseThicknessLog); + mypaintBrush.setMappingPoint( + MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, + MYPAINT_BRUSH_INPUT_PRESSURE, + 1, 1.0, maxThicknessLog - baseThicknessLog); + } + + // opacity may be dynamic + if (minOpacity + precision >= maxOpacity) { + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_OPAQUE, maxOpacity); + mypaintBrush.setMappingN( + MYPAINT_BRUSH_SETTING_OPAQUE, + MYPAINT_BRUSH_INPUT_PRESSURE, + 0 ); + } else { + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_OPAQUE, minOpacity); + mypaintBrush.setMappingN( + MYPAINT_BRUSH_SETTING_OPAQUE, + MYPAINT_BRUSH_INPUT_PRESSURE, + 2 ); + mypaintBrush.setMappingPoint( + MYPAINT_BRUSH_SETTING_OPAQUE, + MYPAINT_BRUSH_INPUT_PRESSURE, + 0, 0.0, 0.0); + mypaintBrush.setMappingPoint( + MYPAINT_BRUSH_SETTING_OPAQUE, + MYPAINT_BRUSH_INPUT_PRESSURE, + 1, 1.0, maxOpacity - minOpacity); + } +} + +void FullColorBrushTool::applyToonzBrushSettings(mypaint::Brush &mypaintBrush) { + TMyPaintBrushStyle *mypaintStyle = getBrushStyle(); + + if (mypaintStyle) { + const double precision = 1e-5; + + double modifierSize = m_modifierSize.getValue()*log(2.0); + double modifierOpacity = 0.01*m_modifierOpacity.getValue(); + + TPixelD color = PixelConverter::from(m_currentColor); + double colorH = 0.0; + double colorS = 0.0; + double colorV = 0.0; + RGB2HSV(color.r, color.g, color.b, &colorH, &colorS, &colorV); + + mypaintBrush.fromBrush(mypaintStyle->getBrush()); + + float baseSize = mypaintBrush.getBaseValue(MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC); + float baseOpacity = mypaintBrush.getBaseValue(MYPAINT_BRUSH_SETTING_OPAQUE); + + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, baseSize + modifierSize); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_OPAQUE, baseOpacity*modifierOpacity); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_COLOR_H, colorH/360.0); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_COLOR_S, colorS); + mypaintBrush.setBaseValue(MYPAINT_BRUSH_SETTING_COLOR_V, colorV); + } else { + applyClassicToonzBrushSettings(mypaintBrush); + } +} + + //========================================================================================================== FullColorBrushToolNotifier::FullColorBrushToolNotifier(FullColorBrushTool *tool) : m_tool(tool) { - TTool::Application *app = m_tool->getApplication(); - TXshLevelHandle *levelHandle; - if (app) levelHandle = app->getCurrentLevel(); - bool ret = false; - if (levelHandle) { - bool ret = connect(levelHandle, SIGNAL(xshCanvasSizeChanged()), this, - SLOT(onCanvasSizeChanged())); - assert(ret); + if (TTool::Application *app = m_tool->getApplication()) { + if (TXshLevelHandle *levelHandle = app->getCurrentLevel()) { + bool ret = connect(levelHandle, SIGNAL(xshCanvasSizeChanged()), this, + SLOT(onCanvasSizeChanged())); + assert(ret); + } + if (TPaletteHandle *paletteHandle = app->getCurrentPalette()) { + bool ret; + ret = connect(paletteHandle, SIGNAL(colorStyleChanged()), this, + SLOT(onColorStyleChanged())); + assert(ret); + ret = connect(paletteHandle, SIGNAL(colorStyleSwitched()), this, + SLOT(onColorStyleChanged())); + assert(ret); + } } } diff --git a/toonz/sources/tnztools/fullcolorbrushtool.h b/toonz/sources/tnztools/fullcolorbrushtool.h index 9175652..d4bf729 100644 --- a/toonz/sources/tnztools/fullcolorbrushtool.h +++ b/toonz/sources/tnztools/fullcolorbrushtool.h @@ -3,7 +3,12 @@ #ifndef FULLCOLORBRUSHTOOL_H #define FULLCOLORBRUSHTOOL_H +#include + #include "brushtool.h" +#include "mypainttoonzbrush.h" +#include "toonz/mypaintbrushstyle.h" +#include //============================================================== @@ -11,8 +16,9 @@ class TTileSetFullColor; class TTileSaverFullColor; -class BluredBrush; +class MyPaintToonzBrush; class FullColorBrushToolNotifier; +namespace mypaint { class Brush; } //============================================================== @@ -20,10 +26,13 @@ class FullColorBrushToolNotifier; // FullColor Brush Tool declaration //************************************************************************ -class FullColorBrushTool final : public TTool { +class FullColorBrushTool final : public TTool, public RasterController { Q_DECLARE_TR_FUNCTIONS(FullColorBrushTool) - void updateCurrentColor(); + void updateCurrentStyle(); + double restartBrushTimer(); + void applyClassicToonzBrushSettings(mypaint::Brush &mypaintBrush); + void applyToonzBrushSettings(mypaint::Brush &mypaintBrush); public: FullColorBrushTool(std::string name); @@ -37,6 +46,9 @@ public: void onActivate() override; void onDeactivate() override; + bool askRead(const TRect &rect) override; + bool askWrite(const TRect &rect) override; + bool preLeftButtonDown() override; void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override; void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override; @@ -63,6 +75,9 @@ public: void removePreset(); void onCanvasSizeChanged(); + void onColorStyleChanged(); + + TMyPaintBrushStyle* getBrushStyle(); protected: TPropertyGroup m_prop; @@ -71,26 +86,24 @@ protected: TBoolProperty m_pressure; TDoublePairProperty m_opacity; TDoubleProperty m_hardness; + TDoubleProperty m_modifierSize; + TDoubleProperty m_modifierOpacity; TEnumProperty m_preset; TPixel32 m_currentColor; - int m_styleId, m_minThick, m_maxThick; + bool m_enabledPressure; + int m_minCursorThick, m_maxCursorThick; - double m_oldOpacity; - - TPointD m_dpiScale, - m_mousePos, //!< Current mouse position, in world coordinates. - m_brushPos; //!< World position the brush will be painted at. + TPointD m_mousePos, //!< Current mouse position, in world coordinates. + m_brushPos; //!< World position the brush will be painted at. TRasterP m_backUpRas; TRaster32P m_workRaster; - TRect m_strokeRect, m_lastRect; - - QRadialGradient m_brushPad; + TRect m_strokeRect, m_strokeSegmentRect, m_lastRect; - std::vector m_points; - BluredBrush *m_brush; + MyPaintToonzBrush *m_toonz_brush; + QElapsedTimer m_brushTimer; TTileSetFullColor *m_tileSet; TTileSaverFullColor *m_tileSaver; @@ -116,8 +129,8 @@ public: FullColorBrushToolNotifier(FullColorBrushTool *tool); protected slots: - void onCanvasSizeChanged() { m_tool->onCanvasSizeChanged(); } + void onColorStyleChanged() { m_tool->onColorStyleChanged(); } }; #endif // FULLCOLORBRUSHTOOL_H diff --git a/toonz/sources/tnztools/geometrictool.cpp b/toonz/sources/tnztools/geometrictool.cpp index 617d3e3..081dc91 100644 --- a/toonz/sources/tnztools/geometrictool.cpp +++ b/toonz/sources/tnztools/geometrictool.cpp @@ -1517,6 +1517,11 @@ void MultiLinePrimitive::mouseMove(const TPointD &pos, const TMouseEvent &e) { //----------------------------------------------------------------------------- bool MultiLinePrimitive::keyDown(int key, const TPoint &point) { + if (key == TwConsts::TK_Return) { + endLine(); + return true; + } + if (key != TwConsts::TK_Esc || !m_isEditing) return false; UINT size = m_vertex.size(); diff --git a/toonz/sources/tnztools/mypainttoonzbrush.cpp b/toonz/sources/tnztools/mypainttoonzbrush.cpp new file mode 100644 index 0000000..f6e722b --- /dev/null +++ b/toonz/sources/tnztools/mypainttoonzbrush.cpp @@ -0,0 +1,165 @@ + +#include + +#include "mypainttoonzbrush.h" +#include "tropcm.h" +#include "tpixelutils.h" +#include + +#include + + +//======================================================= +// +// Raster32PMyPaintSurface::Internal +// +//======================================================= + +class Raster32PMyPaintSurface::Internal: + public mypaint::helpers::SurfaceCustom +{ +public: + typedef SurfaceCustom Parent; + Internal(Raster32PMyPaintSurface &owner): + SurfaceCustom( owner.m_ras->pixels(), + owner.m_ras->getLx(), + owner.m_ras->getLy(), + owner.m_ras->getPixelSize(), + owner.m_ras->getRowSize(), + &owner ) + { } +}; + +//======================================================= +// +// Raster32PMyPaintSurface +// +//======================================================= + +Raster32PMyPaintSurface::Raster32PMyPaintSurface(const TRaster32P &ras): + m_ras(ras), + controller(), + internal() +{ + assert(ras); + internal = new Internal(*this); +} + +Raster32PMyPaintSurface::Raster32PMyPaintSurface(const TRaster32P &ras, RasterController &controller): + m_ras(ras), + controller(&controller), + internal() +{ + assert(ras); + internal = new Internal(*this); +} + +Raster32PMyPaintSurface::~Raster32PMyPaintSurface() + { delete internal; } + +bool Raster32PMyPaintSurface::getColor(float x, float y, float radius, + float &colorR, float &colorG, float &colorB, float &colorA) +{ return internal->getColor(x, y, radius, colorR, colorG, colorB, colorA); } + +bool Raster32PMyPaintSurface::drawDab(const mypaint::Dab &dab) + { return internal->drawDab(dab); } + +bool Raster32PMyPaintSurface::getAntialiasing() const + { return internal->antialiasing; } + +void Raster32PMyPaintSurface::setAntialiasing(bool value) + { internal->antialiasing = value; } + +//======================================================= +// +// MyPaintToonzBrush +// +//======================================================= + +MyPaintToonzBrush::MyPaintToonzBrush(const TRaster32P &ras, RasterController &controller, const mypaint::Brush &brush): + m_ras(ras), + m_mypaintSurface(m_ras, controller), + brush(brush), + reset(true) +{ + // read brush antialiasing settings + float aa = this->brush.getBaseValue(MYPAINT_BRUSH_SETTING_ANTI_ALIASING); + m_mypaintSurface.setAntialiasing(aa > 0.5f); + + // reset brush antialiasing to zero to avoid radius and hardness correction + this->brush.setBaseValue(MYPAINT_BRUSH_SETTING_ANTI_ALIASING, 0.f); + for(int i = 0; i < MYPAINT_BRUSH_INPUTS_COUNT; ++i) + this->brush.setMappingN(MYPAINT_BRUSH_SETTING_ANTI_ALIASING, (MyPaintBrushInput)i, 0); +} + +void MyPaintToonzBrush::beginStroke() { + brush.reset(); + brush.newStroke(); + reset = true; +} + +void MyPaintToonzBrush::endStroke() { + if (!reset) { + strokeTo(TPointD(current.x, current.y), current.pressure, 0.f); + beginStroke(); + } +} + +void MyPaintToonzBrush::strokeTo(const TPointD &point, double pressure, double dtime) { + Params next(point.x, point.y, pressure, 0.0); + + if (reset) { + current = next; + previous = current; + reset = false; + // we need to jump to initial point (heuristic) + brush.setState(MYPAINT_BRUSH_STATE_X, current.x); + brush.setState(MYPAINT_BRUSH_STATE_Y, current.y); + brush.setState(MYPAINT_BRUSH_STATE_ACTUAL_X, current.x); + brush.setState(MYPAINT_BRUSH_STATE_ACTUAL_Y, current.y); + return; + } else { + next.time = current.time + dtime; + } + + // accuracy + const double threshold = 1.0; + const double thresholdSqr = threshold*threshold; + const int maxLevel = 16; + + // set initial segment + Segment stack[maxLevel+1]; + Params p0; + Segment *segment = stack; + Segment *maxSegment = segment + maxLevel; + p0.setMedian(previous, current); + segment->p1 = current; + segment->p2.setMedian(current, next); + + // process + while(true) { + double dx = segment->p2.x - p0.x; + double dy = segment->p2.y - p0.y; + if (dx*dx + dy*dy > thresholdSqr && segment != maxSegment) { + Segment *sub = segment + 1; + sub->p1.setMedian(p0, segment->p1); + segment->p1.setMedian(segment->p1, segment->p2); + sub->p2.setMedian(sub->p1, segment->p1); + segment = sub; + } else { + brush.strokeTo(m_mypaintSurface, segment->p2.x, segment->p2.y, segment->p2.pressure, 0.f, 0.f, segment->p2.time - p0.time); + if (segment == stack) break; + p0 = segment->p2; + --segment; + } + } + + // keep parameters for future interpolation + previous = current; + current = next; + + // shift time + previous.time = 0.0; + current.time = dtime; +} + diff --git a/toonz/sources/tnztools/mypainttoonzbrush.h b/toonz/sources/tnztools/mypainttoonzbrush.h new file mode 100644 index 0000000..898fe2c --- /dev/null +++ b/toonz/sources/tnztools/mypainttoonzbrush.h @@ -0,0 +1,116 @@ +#pragma once + +#ifndef MYPAINTTOONZBRUSH_H +#define MYPAINTTOONZBRUSH_H + +#include +#include "traster.h" +#include "trastercm.h" +#include "tcurves.h" +#include +#include + + +class RasterController { +public: + virtual ~RasterController() { } + virtual bool askRead(const TRect &rect) { return true; } + virtual bool askWrite(const TRect &rect) { return true; } +}; + +//======================================================= +// +// Raster32PMyPaintSurface +// +//======================================================= + +class Raster32PMyPaintSurface: public mypaint::Surface { +private: + class Internal; + + TRaster32P m_ras; + RasterController *controller; + Internal *internal; + + inline static void readPixel(const void *pixelPtr, float &colorR, float &colorG, float &colorB, float &colorA) { + const TPixel32 &pixel = *(const TPixel32*)pixelPtr; + colorR = (float)pixel.r/(float)TPixel32::maxChannelValue; + colorG = (float)pixel.g/(float)TPixel32::maxChannelValue; + colorB = (float)pixel.b/(float)TPixel32::maxChannelValue; + colorA = (float)pixel.m/(float)TPixel32::maxChannelValue; + } + + inline static void writePixel(void *pixelPtr, float colorR, float colorG, float colorB, float colorA) { + TPixel32 &pixel = *(TPixel32*)pixelPtr; + pixel.r = (TPixel32::Channel)roundf(colorR * TPixel32::maxChannelValue); + pixel.g = (TPixel32::Channel)roundf(colorG * TPixel32::maxChannelValue); + pixel.b = (TPixel32::Channel)roundf(colorB * TPixel32::maxChannelValue); + pixel.m = (TPixel32::Channel)roundf(colorA * TPixel32::maxChannelValue); + } + + inline static bool askRead(void *surfaceController, const void* /* surfacePointer */, int x0, int y0, int x1, int y1) { + Raster32PMyPaintSurface &owner = *((Raster32PMyPaintSurface*)surfaceController); + return !owner.controller || owner.controller->askRead(TRect(x0, y0, x1, y1)); + } + + inline static bool askWrite(void *surfaceController, const void* /* surfacePointer */, int x0, int y0, int x1, int y1) { + Raster32PMyPaintSurface &owner = *((Raster32PMyPaintSurface*)surfaceController); + return !owner.controller || owner.controller->askWrite(TRect(x0, y0, x1, y1)); + } + +public: + explicit Raster32PMyPaintSurface(const TRaster32P &ras); + explicit Raster32PMyPaintSurface(const TRaster32P &ras, RasterController &controller); + ~Raster32PMyPaintSurface(); + + bool getColor(float x, float y, float radius, + float &colorR, float &colorG, float &colorB, float &colorA) override; + + bool drawDab(const mypaint::Dab &dab) override; + + bool getAntialiasing() const; + void setAntialiasing(bool value); +}; + +//======================================================= +// +// MyPaintToonzBrush +// +//======================================================= + +class MyPaintToonzBrush { +private: + struct Params { + union { + struct { double x, y, pressure, time; }; + struct { double values[4]; }; + }; + + inline explicit Params(double x = 0.0, double y = 0.0, double pressure = 0.0, double time = 0.0): + x(x), y(y), pressure(pressure), time(time) { } + + inline void setMedian(Params &a, Params &b) { + for(int i = 0; i < (int)sizeof(values)/sizeof(values[0]); ++i) + values[i] = 0.5*(a.values[i] + b.values[i]); + } + }; + + struct Segment { + Params p1, p2; + }; + + TRaster32P m_ras; + Raster32PMyPaintSurface m_mypaintSurface; + mypaint::Brush brush; + + bool reset; + Params previous, current; + +public: + MyPaintToonzBrush(const TRaster32P &ras, RasterController &controller, const mypaint::Brush &brush); + void beginStroke(); + void endStroke(); + void strokeTo(const TPointD &p, double pressure, double dtime); +}; + +#endif // T_BLUREDBRUSH diff --git a/toonz/sources/tnztools/tooloptions.cpp b/toonz/sources/tnztools/tooloptions.cpp index 5bb6d7a..5157985 100644 --- a/toonz/sources/tnztools/tooloptions.cpp +++ b/toonz/sources/tnztools/tooloptions.cpp @@ -31,10 +31,12 @@ #include "toonz/txsheethandle.h" #include "toonz/tstageobjectspline.h" #include "toonz/tframehandle.h" +#include "toonz/tpalettehandle.h" #include "toonz/palettecontroller.h" #include "toonz/txshlevelhandle.h" #include "toonz/preferences.h" #include "toonz/tstageobjecttree.h" +#include "toonz/mypaintbrushstyle.h" // TnzCore includes #include "tproperty.h" @@ -1622,11 +1624,39 @@ BrushToolOptionsBox::BrushToolOptionsBox(QWidget *parent, TTool *tool, TStroke::OutlineOptions::MITER_JOIN); } hLayout()->addStretch(1); + filterControls(); +} + +//----------------------------------------------------------------------------- + +void BrushToolOptionsBox::filterControls() { + // show or hide widgets which modify imported brush (mypaint) + + bool showModifiers = false; + if (FullColorBrushTool* fullColorBrushTool = dynamic_cast(m_tool)) + showModifiers = fullColorBrushTool->getBrushStyle(); + + for (QMap::iterator it = m_labels.begin(); it != m_labels.end(); it++) { + bool isModifier = (it.key().substr(0, 8) == "Modifier"); + bool isCommon = (it.key() == "Pressure" || it.key() == "Preset:"); + bool visible = isCommon || (isModifier == showModifiers); + it.value()->setVisible(visible); + } + + for (QMap::iterator it = m_controls.begin(); it != m_controls.end(); it++) { + bool isModifier = (it.key().substr(0, 8) == "Modifier"); + bool isCommon = (it.key() == "Pressure" || it.key() == "Preset:"); + bool visible = isCommon || (isModifier == showModifiers); + if (QWidget* widget = dynamic_cast(it.value())) + widget->setVisible(visible); + } } //----------------------------------------------------------------------------- void BrushToolOptionsBox::updateStatus() { + filterControls(); + QMap::iterator it; for (it = m_controls.begin(); it != m_controls.end(); it++) it.value()->updateStatus(); diff --git a/toonz/sources/tnztools/tooloptionscontrols.cpp b/toonz/sources/tnztools/tooloptionscontrols.cpp index 457e7dc..72bdf8f 100644 --- a/toonz/sources/tnztools/tooloptionscontrols.cpp +++ b/toonz/sources/tnztools/tooloptionscontrols.cpp @@ -650,9 +650,14 @@ ToolOptionPopupButton::ToolOptionPopupButton(TTool *tool, TEnumProperty::Range range = property->getRange(); TEnumProperty::Range::iterator it; - for (it = range.begin(); it != range.end(); ++it) - addItem(createQIconPNG(QString::fromStdWString(*it).toUtf8())); - + for (it = range.begin(); it != range.end(); ++it) { + QString iconName = QString::fromStdWString(*it); + QAction *action = addItem(createQIcon(iconName.toUtf8())); + // make the tooltip text + iconName = iconName.replace('_', ' '); + iconName = iconName.left(1).toUpper() + iconName.mid(1); + action->setToolTip(iconName); + } setCurrentIndex(0); updateStatus(); connect(this, SIGNAL(activated(int)), this, SLOT(onActivated(int))); diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 52c41b2..8829c07 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -19,6 +19,7 @@ set(MOC_HEADERS cellkeyframedata.h cellkeyframeselection.h cellselection.h + ../include/cellposition.h cleanuppaletteviewer.h cleanuppopup.h cleanuppreview.h @@ -61,6 +62,7 @@ set(MOC_HEADERS keyframedata.h keyframeselection.h keyframemover.h + layerheaderpanel.h levelcreatepopup.h levelsettingspopup.h linesfadepopup.h @@ -77,6 +79,7 @@ set(MOC_HEADERS meshifypopup.h messagepanel.h moviegenerator.h + ../include/orientation.h onionskinmaskgui.h outputsettingspopup.h overwritepopup.h @@ -90,6 +93,7 @@ set(MOC_HEADERS renumberpopup.h reslist.h ruler.h + ../include/saveloadqsettings.h savepresetpopup.h scanlist.h scanpopup.h @@ -217,6 +221,7 @@ set(SOURCES fxparameditorpopup.cpp histogrampopup.cpp insertfxpopup.cpp + layerheaderpanel.cpp levelcreatepopup.cpp levelsettingspopup.cpp linetestcapturepane.cpp @@ -558,7 +563,7 @@ TOONZLIBRARY=\"\$HOME/.config/OpenToonz/stuff/library\" TOONZPROFILES=\"\$HOME/.config/OpenToonz/stuff/profiles\" TOONZPROJECTS=\"$HOME/.config/OpenToonz/stuff/projects\" TOONZROOT=\"\$HOME/.config/OpenToonz/stuff\" -TOONZSTUDIOPALETTE=\"\$HOME/.config/OpenToonz/stuff/projects/studiopalette\" +TOONZSTUDIOPALETTE=\"\$HOME/.config/OpenToonz/stuff/studiopalette\" EOF fi diff --git a/toonz/sources/toonz/Resources/addcleanup_off.png b/toonz/sources/toonz/Resources/addcleanup_off.png deleted file mode 100644 index 88e7b07..0000000 Binary files a/toonz/sources/toonz/Resources/addcleanup_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/addcleanup_off.svg b/toonz/sources/toonz/Resources/addcleanup_off.svg new file mode 100644 index 0000000..5521c7c --- /dev/null +++ b/toonz/sources/toonz/Resources/addcleanup_off.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/addcleanup_on.png b/toonz/sources/toonz/Resources/addcleanup_on.png deleted file mode 100644 index e8337df..0000000 Binary files a/toonz/sources/toonz/Resources/addcleanup_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/addcleanup_on.svg b/toonz/sources/toonz/Resources/addcleanup_on.svg new file mode 100644 index 0000000..17efc90 --- /dev/null +++ b/toonz/sources/toonz/Resources/addcleanup_on.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/addrender_off.png b/toonz/sources/toonz/Resources/addrender_off.png deleted file mode 100644 index a31db07..0000000 Binary files a/toonz/sources/toonz/Resources/addrender_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/addrender_off.svg b/toonz/sources/toonz/Resources/addrender_off.svg new file mode 100644 index 0000000..3856732 --- /dev/null +++ b/toonz/sources/toonz/Resources/addrender_off.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/addrender_on.png b/toonz/sources/toonz/Resources/addrender_on.png deleted file mode 100644 index 7c21bc1..0000000 Binary files a/toonz/sources/toonz/Resources/addrender_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/addrender_on.svg b/toonz/sources/toonz/Resources/addrender_on.svg new file mode 100644 index 0000000..fb1980f --- /dev/null +++ b/toonz/sources/toonz/Resources/addrender_on.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/bevel_join.png b/toonz/sources/toonz/Resources/bevel_join.png deleted file mode 100644 index e91c52e..0000000 Binary files a/toonz/sources/toonz/Resources/bevel_join.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/bevel_join.svg b/toonz/sources/toonz/Resources/bevel_join.svg new file mode 100644 index 0000000..8d62610 --- /dev/null +++ b/toonz/sources/toonz/Resources/bevel_join.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/butt_cap.png b/toonz/sources/toonz/Resources/butt_cap.png deleted file mode 100644 index e2c51a0..0000000 Binary files a/toonz/sources/toonz/Resources/butt_cap.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/butt_cap.svg b/toonz/sources/toonz/Resources/butt_cap.svg new file mode 100644 index 0000000..07e1015 --- /dev/null +++ b/toonz/sources/toonz/Resources/butt_cap.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelblue.png b/toonz/sources/toonz/Resources/channelblue.png deleted file mode 100644 index 0683e32..0000000 Binary files a/toonz/sources/toonz/Resources/channelblue.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelblue.svg b/toonz/sources/toonz/Resources/channelblue.svg index 97f44ea..151560a 100644 --- a/toonz/sources/toonz/Resources/channelblue.svg +++ b/toonz/sources/toonz/Resources/channelblue.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelblue_click.png b/toonz/sources/toonz/Resources/channelblue_click.png deleted file mode 100644 index 8a3b08e..0000000 Binary files a/toonz/sources/toonz/Resources/channelblue_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelblue_click.svg b/toonz/sources/toonz/Resources/channelblue_click.svg index 3df884e..c5d7244 100644 --- a/toonz/sources/toonz/Resources/channelblue_click.svg +++ b/toonz/sources/toonz/Resources/channelblue_click.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelblue_over.png b/toonz/sources/toonz/Resources/channelblue_over.png deleted file mode 100644 index 09f90d6..0000000 Binary files a/toonz/sources/toonz/Resources/channelblue_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelblue_over.svg b/toonz/sources/toonz/Resources/channelblue_over.svg index 1dae935..dfd1b95 100644 --- a/toonz/sources/toonz/Resources/channelblue_over.svg +++ b/toonz/sources/toonz/Resources/channelblue_over.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelgreen.png b/toonz/sources/toonz/Resources/channelgreen.png deleted file mode 100644 index 03160a4..0000000 Binary files a/toonz/sources/toonz/Resources/channelgreen.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelgreen.svg b/toonz/sources/toonz/Resources/channelgreen.svg index 82a3e1a..2cbf7a5 100644 --- a/toonz/sources/toonz/Resources/channelgreen.svg +++ b/toonz/sources/toonz/Resources/channelgreen.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelgreen_click.png b/toonz/sources/toonz/Resources/channelgreen_click.png deleted file mode 100644 index 1f958f2..0000000 Binary files a/toonz/sources/toonz/Resources/channelgreen_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelgreen_click.svg b/toonz/sources/toonz/Resources/channelgreen_click.svg index 457d160..2713893 100644 --- a/toonz/sources/toonz/Resources/channelgreen_click.svg +++ b/toonz/sources/toonz/Resources/channelgreen_click.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelgreen_over.png b/toonz/sources/toonz/Resources/channelgreen_over.png deleted file mode 100644 index e3ddc86..0000000 Binary files a/toonz/sources/toonz/Resources/channelgreen_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelgreen_over.svg b/toonz/sources/toonz/Resources/channelgreen_over.svg index e49ede8..aad0657 100644 --- a/toonz/sources/toonz/Resources/channelgreen_over.svg +++ b/toonz/sources/toonz/Resources/channelgreen_over.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelmatte.png b/toonz/sources/toonz/Resources/channelmatte.png deleted file mode 100644 index da89409..0000000 Binary files a/toonz/sources/toonz/Resources/channelmatte.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelmatte.svg b/toonz/sources/toonz/Resources/channelmatte.svg index 126a855..b7b92f8 100644 --- a/toonz/sources/toonz/Resources/channelmatte.svg +++ b/toonz/sources/toonz/Resources/channelmatte.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelmatte_click.png b/toonz/sources/toonz/Resources/channelmatte_click.png deleted file mode 100644 index 0fee16e..0000000 Binary files a/toonz/sources/toonz/Resources/channelmatte_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelmatte_click.svg b/toonz/sources/toonz/Resources/channelmatte_click.svg index 14d2f47..d357ce0 100644 --- a/toonz/sources/toonz/Resources/channelmatte_click.svg +++ b/toonz/sources/toonz/Resources/channelmatte_click.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelmatte_over.png b/toonz/sources/toonz/Resources/channelmatte_over.png deleted file mode 100644 index 176f20e..0000000 Binary files a/toonz/sources/toonz/Resources/channelmatte_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelmatte_over.svg b/toonz/sources/toonz/Resources/channelmatte_over.svg index 9a364da..b2c5896 100644 --- a/toonz/sources/toonz/Resources/channelmatte_over.svg +++ b/toonz/sources/toonz/Resources/channelmatte_over.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelred.png b/toonz/sources/toonz/Resources/channelred.png deleted file mode 100644 index eba971e..0000000 Binary files a/toonz/sources/toonz/Resources/channelred.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelred.svg b/toonz/sources/toonz/Resources/channelred.svg index b0a191f..6caf7cf 100644 --- a/toonz/sources/toonz/Resources/channelred.svg +++ b/toonz/sources/toonz/Resources/channelred.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelred_click.png b/toonz/sources/toonz/Resources/channelred_click.png deleted file mode 100644 index 9c15b93..0000000 Binary files a/toonz/sources/toonz/Resources/channelred_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelred_click.svg b/toonz/sources/toonz/Resources/channelred_click.svg index b200272..5902207 100644 --- a/toonz/sources/toonz/Resources/channelred_click.svg +++ b/toonz/sources/toonz/Resources/channelred_click.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/channelred_over.png b/toonz/sources/toonz/Resources/channelred_over.png deleted file mode 100644 index ed592d9..0000000 Binary files a/toonz/sources/toonz/Resources/channelred_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/channelred_over.svg b/toonz/sources/toonz/Resources/channelred_over.svg index a0a1efc..58cd793 100644 --- a/toonz/sources/toonz/Resources/channelred_over.svg +++ b/toonz/sources/toonz/Resources/channelred_over.svg @@ -1,38 +1,19 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cleanup_computing.png b/toonz/sources/toonz/Resources/cleanup_computing.png deleted file mode 100644 index 0cea776..0000000 Binary files a/toonz/sources/toonz/Resources/cleanup_computing.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cleanup_computing.svg b/toonz/sources/toonz/Resources/cleanup_computing.svg new file mode 100644 index 0000000..e2952b3 --- /dev/null +++ b/toonz/sources/toonz/Resources/cleanup_computing.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cleanup_done.png b/toonz/sources/toonz/Resources/cleanup_done.png deleted file mode 100644 index cafcd9a..0000000 Binary files a/toonz/sources/toonz/Resources/cleanup_done.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cleanup_done.svg b/toonz/sources/toonz/Resources/cleanup_done.svg new file mode 100644 index 0000000..1484bfb --- /dev/null +++ b/toonz/sources/toonz/Resources/cleanup_done.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cleanup_done_with_errors.png b/toonz/sources/toonz/Resources/cleanup_done_with_errors.png deleted file mode 100644 index 83462fa..0000000 Binary files a/toonz/sources/toonz/Resources/cleanup_done_with_errors.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cleanup_done_with_errors.svg b/toonz/sources/toonz/Resources/cleanup_done_with_errors.svg new file mode 100644 index 0000000..edd7981 --- /dev/null +++ b/toonz/sources/toonz/Resources/cleanup_done_with_errors.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cleanup_failed.png b/toonz/sources/toonz/Resources/cleanup_failed.png deleted file mode 100644 index 0ae0120..0000000 Binary files a/toonz/sources/toonz/Resources/cleanup_failed.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cleanup_failed.svg b/toonz/sources/toonz/Resources/cleanup_failed.svg new file mode 100644 index 0000000..f27676a --- /dev/null +++ b/toonz/sources/toonz/Resources/cleanup_failed.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cleanup_suspended.png b/toonz/sources/toonz/Resources/cleanup_suspended.png deleted file mode 100644 index 6edf133..0000000 Binary files a/toonz/sources/toonz/Resources/cleanup_suspended.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cleanup_suspended.svg b/toonz/sources/toonz/Resources/cleanup_suspended.svg new file mode 100644 index 0000000..b5b374c --- /dev/null +++ b/toonz/sources/toonz/Resources/cleanup_suspended.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cln_computing.png b/toonz/sources/toonz/Resources/cln_computing.png deleted file mode 100644 index b67cd8a..0000000 Binary files a/toonz/sources/toonz/Resources/cln_computing.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cln_computing.svg b/toonz/sources/toonz/Resources/cln_computing.svg new file mode 100644 index 0000000..da183ac --- /dev/null +++ b/toonz/sources/toonz/Resources/cln_computing.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cln_done.png b/toonz/sources/toonz/Resources/cln_done.png deleted file mode 100644 index 4977171..0000000 Binary files a/toonz/sources/toonz/Resources/cln_done.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cln_done.svg b/toonz/sources/toonz/Resources/cln_done.svg new file mode 100644 index 0000000..b7fe4b1 --- /dev/null +++ b/toonz/sources/toonz/Resources/cln_done.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cln_done_with_errors.png b/toonz/sources/toonz/Resources/cln_done_with_errors.png deleted file mode 100644 index 4c2ed78..0000000 Binary files a/toonz/sources/toonz/Resources/cln_done_with_errors.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cln_done_with_errors.svg b/toonz/sources/toonz/Resources/cln_done_with_errors.svg new file mode 100644 index 0000000..6769e5a --- /dev/null +++ b/toonz/sources/toonz/Resources/cln_done_with_errors.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cln_failed.png b/toonz/sources/toonz/Resources/cln_failed.png deleted file mode 100644 index 274d60c..0000000 Binary files a/toonz/sources/toonz/Resources/cln_failed.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cln_failed.svg b/toonz/sources/toonz/Resources/cln_failed.svg new file mode 100644 index 0000000..1151a7b --- /dev/null +++ b/toonz/sources/toonz/Resources/cln_failed.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/cln_suspended.png b/toonz/sources/toonz/Resources/cln_suspended.png deleted file mode 100644 index cf6bb9c..0000000 Binary files a/toonz/sources/toonz/Resources/cln_suspended.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/cln_suspended.svg b/toonz/sources/toonz/Resources/cln_suspended.svg new file mode 100644 index 0000000..a760467 --- /dev/null +++ b/toonz/sources/toonz/Resources/cln_suspended.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/compare.png b/toonz/sources/toonz/Resources/compare.png deleted file mode 100644 index aac7123..0000000 Binary files a/toonz/sources/toonz/Resources/compare.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/compare.svg b/toonz/sources/toonz/Resources/compare.svg new file mode 100644 index 0000000..597ccf8 --- /dev/null +++ b/toonz/sources/toonz/Resources/compare.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/compare_click.png b/toonz/sources/toonz/Resources/compare_click.png deleted file mode 100644 index 05d7fdb..0000000 Binary files a/toonz/sources/toonz/Resources/compare_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/compare_click.svg b/toonz/sources/toonz/Resources/compare_click.svg new file mode 100644 index 0000000..ff81b4f --- /dev/null +++ b/toonz/sources/toonz/Resources/compare_click.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/compare_over.png b/toonz/sources/toonz/Resources/compare_over.png deleted file mode 100644 index 7ed9f5c..0000000 Binary files a/toonz/sources/toonz/Resources/compare_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/compare_over.svg b/toonz/sources/toonz/Resources/compare_over.svg new file mode 100644 index 0000000..a1bf390 --- /dev/null +++ b/toonz/sources/toonz/Resources/compare_over.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/define_subcamera_preview.png b/toonz/sources/toonz/Resources/define_subcamera_preview.png deleted file mode 100644 index b4a27be..0000000 Binary files a/toonz/sources/toonz/Resources/define_subcamera_preview.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/define_subcamera_preview.svg b/toonz/sources/toonz/Resources/define_subcamera_preview.svg new file mode 100644 index 0000000..ea183b3 --- /dev/null +++ b/toonz/sources/toonz/Resources/define_subcamera_preview.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/define_subcamera_preview_click.png b/toonz/sources/toonz/Resources/define_subcamera_preview_click.png deleted file mode 100644 index 5ff535b..0000000 Binary files a/toonz/sources/toonz/Resources/define_subcamera_preview_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/define_subcamera_preview_click.svg b/toonz/sources/toonz/Resources/define_subcamera_preview_click.svg new file mode 100644 index 0000000..431667a --- /dev/null +++ b/toonz/sources/toonz/Resources/define_subcamera_preview_click.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/define_subcamera_preview_over.png b/toonz/sources/toonz/Resources/define_subcamera_preview_over.png deleted file mode 100644 index 30b7d77..0000000 Binary files a/toonz/sources/toonz/Resources/define_subcamera_preview_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/define_subcamera_preview_over.svg b/toonz/sources/toonz/Resources/define_subcamera_preview_over.svg new file mode 100644 index 0000000..3fd26fc --- /dev/null +++ b/toonz/sources/toonz/Resources/define_subcamera_preview_over.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/delete_off.png b/toonz/sources/toonz/Resources/delete_off.png deleted file mode 100644 index 4d545cd..0000000 Binary files a/toonz/sources/toonz/Resources/delete_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/delete_off.svg b/toonz/sources/toonz/Resources/delete_off.svg new file mode 100644 index 0000000..fc32734 --- /dev/null +++ b/toonz/sources/toonz/Resources/delete_off.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/delete_on.png b/toonz/sources/toonz/Resources/delete_on.png deleted file mode 100644 index a9ee116..0000000 Binary files a/toonz/sources/toonz/Resources/delete_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/delete_on.svg b/toonz/sources/toonz/Resources/delete_on.svg new file mode 100644 index 0000000..d37dd8e --- /dev/null +++ b/toonz/sources/toonz/Resources/delete_on.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/farm_tasks.png b/toonz/sources/toonz/Resources/farm_tasks.png deleted file mode 100644 index 20d2365..0000000 Binary files a/toonz/sources/toonz/Resources/farm_tasks.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/farm_tasks.svg b/toonz/sources/toonz/Resources/farm_tasks.svg new file mode 100644 index 0000000..8515433 --- /dev/null +++ b/toonz/sources/toonz/Resources/farm_tasks.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/fb_history_back_disable.png b/toonz/sources/toonz/Resources/fb_history_back_disable.png deleted file mode 100644 index a555412..0000000 Binary files a/toonz/sources/toonz/Resources/fb_history_back_disable.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/fb_history_back_disable.svg b/toonz/sources/toonz/Resources/fb_history_back_disable.svg new file mode 100644 index 0000000..2c6865b --- /dev/null +++ b/toonz/sources/toonz/Resources/fb_history_back_disable.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/fb_history_back_enable.png b/toonz/sources/toonz/Resources/fb_history_back_enable.png deleted file mode 100644 index a40b354..0000000 Binary files a/toonz/sources/toonz/Resources/fb_history_back_enable.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/fb_history_back_enable.svg b/toonz/sources/toonz/Resources/fb_history_back_enable.svg new file mode 100644 index 0000000..8141f38 --- /dev/null +++ b/toonz/sources/toonz/Resources/fb_history_back_enable.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/fb_history_fwd_disable.png b/toonz/sources/toonz/Resources/fb_history_fwd_disable.png deleted file mode 100644 index 4f6c56a..0000000 Binary files a/toonz/sources/toonz/Resources/fb_history_fwd_disable.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/fb_history_fwd_disable.svg b/toonz/sources/toonz/Resources/fb_history_fwd_disable.svg new file mode 100644 index 0000000..a6e0642 --- /dev/null +++ b/toonz/sources/toonz/Resources/fb_history_fwd_disable.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/fb_history_fwd_enable.png b/toonz/sources/toonz/Resources/fb_history_fwd_enable.png deleted file mode 100644 index d5d7a3b..0000000 Binary files a/toonz/sources/toonz/Resources/fb_history_fwd_enable.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/fb_history_fwd_enable.svg b/toonz/sources/toonz/Resources/fb_history_fwd_enable.svg new file mode 100644 index 0000000..00cc554 --- /dev/null +++ b/toonz/sources/toonz/Resources/fb_history_fwd_enable.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/folderup.png b/toonz/sources/toonz/Resources/folderup.png deleted file mode 100644 index 1da9162..0000000 Binary files a/toonz/sources/toonz/Resources/folderup.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/folderup.svg b/toonz/sources/toonz/Resources/folderup.svg new file mode 100644 index 0000000..18c928b --- /dev/null +++ b/toonz/sources/toonz/Resources/folderup.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/folderup_over.png b/toonz/sources/toonz/Resources/folderup_over.png deleted file mode 100644 index 8e18846..0000000 Binary files a/toonz/sources/toonz/Resources/folderup_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/folderup_over.svg b/toonz/sources/toonz/Resources/folderup_over.svg new file mode 100644 index 0000000..4f5a627 --- /dev/null +++ b/toonz/sources/toonz/Resources/folderup_over.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framefirst.png b/toonz/sources/toonz/Resources/framefirst.png deleted file mode 100644 index 9f6ae70..0000000 Binary files a/toonz/sources/toonz/Resources/framefirst.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framefirst.svg b/toonz/sources/toonz/Resources/framefirst.svg index 71fae3b..d1b3cd2 100644 --- a/toonz/sources/toonz/Resources/framefirst.svg +++ b/toonz/sources/toonz/Resources/framefirst.svg @@ -1,39 +1,20 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framefirst_click.png b/toonz/sources/toonz/Resources/framefirst_click.png deleted file mode 100644 index 247a234..0000000 Binary files a/toonz/sources/toonz/Resources/framefirst_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framefirst_click.svg b/toonz/sources/toonz/Resources/framefirst_click.svg index 5767acd..225680d 100644 --- a/toonz/sources/toonz/Resources/framefirst_click.svg +++ b/toonz/sources/toonz/Resources/framefirst_click.svg @@ -1,39 +1,24 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framefirst_over.png b/toonz/sources/toonz/Resources/framefirst_over.png deleted file mode 100644 index 247a234..0000000 Binary files a/toonz/sources/toonz/Resources/framefirst_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framefirst_over.svg b/toonz/sources/toonz/Resources/framefirst_over.svg index 399b3d2..88b653a 100644 --- a/toonz/sources/toonz/Resources/framefirst_over.svg +++ b/toonz/sources/toonz/Resources/framefirst_over.svg @@ -1,39 +1,24 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framelast.png b/toonz/sources/toonz/Resources/framelast.png deleted file mode 100644 index 15fa34a..0000000 Binary files a/toonz/sources/toonz/Resources/framelast.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framelast.svg b/toonz/sources/toonz/Resources/framelast.svg index 03fb54b..b4f321b 100644 --- a/toonz/sources/toonz/Resources/framelast.svg +++ b/toonz/sources/toonz/Resources/framelast.svg @@ -1,39 +1,24 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framelast_click.png b/toonz/sources/toonz/Resources/framelast_click.png deleted file mode 100644 index 2b95d35..0000000 Binary files a/toonz/sources/toonz/Resources/framelast_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framelast_click.svg b/toonz/sources/toonz/Resources/framelast_click.svg index b713370..29be56c 100644 --- a/toonz/sources/toonz/Resources/framelast_click.svg +++ b/toonz/sources/toonz/Resources/framelast_click.svg @@ -1,39 +1,24 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framelast_over.png b/toonz/sources/toonz/Resources/framelast_over.png deleted file mode 100644 index 2b95d35..0000000 Binary files a/toonz/sources/toonz/Resources/framelast_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framelast_over.svg b/toonz/sources/toonz/Resources/framelast_over.svg index b3c3985..b7aa303 100644 --- a/toonz/sources/toonz/Resources/framelast_over.svg +++ b/toonz/sources/toonz/Resources/framelast_over.svg @@ -1,39 +1,24 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framenext.png b/toonz/sources/toonz/Resources/framenext.png deleted file mode 100644 index 4366214..0000000 Binary files a/toonz/sources/toonz/Resources/framenext.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framenext.svg b/toonz/sources/toonz/Resources/framenext.svg index 4a44d82..3f255dc 100644 --- a/toonz/sources/toonz/Resources/framenext.svg +++ b/toonz/sources/toonz/Resources/framenext.svg @@ -1,39 +1,22 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framenext_click.png b/toonz/sources/toonz/Resources/framenext_click.png deleted file mode 100644 index 31472de..0000000 Binary files a/toonz/sources/toonz/Resources/framenext_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framenext_click.svg b/toonz/sources/toonz/Resources/framenext_click.svg index 30e8696..041acd8 100644 --- a/toonz/sources/toonz/Resources/framenext_click.svg +++ b/toonz/sources/toonz/Resources/framenext_click.svg @@ -1,39 +1,22 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/framenext_over.png b/toonz/sources/toonz/Resources/framenext_over.png deleted file mode 100644 index 31472de..0000000 Binary files a/toonz/sources/toonz/Resources/framenext_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/framenext_over.svg b/toonz/sources/toonz/Resources/framenext_over.svg index 95776b2..468a525 100644 --- a/toonz/sources/toonz/Resources/framenext_over.svg +++ b/toonz/sources/toonz/Resources/framenext_over.svg @@ -1,39 +1,22 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/frameprev.png b/toonz/sources/toonz/Resources/frameprev.png deleted file mode 100644 index 3993839..0000000 Binary files a/toonz/sources/toonz/Resources/frameprev.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/frameprev.svg b/toonz/sources/toonz/Resources/frameprev.svg index 69b23e3..7bb8920 100644 --- a/toonz/sources/toonz/Resources/frameprev.svg +++ b/toonz/sources/toonz/Resources/frameprev.svg @@ -1,39 +1,24 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/frameprev_click.png b/toonz/sources/toonz/Resources/frameprev_click.png deleted file mode 100644 index a98be27..0000000 Binary files a/toonz/sources/toonz/Resources/frameprev_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/frameprev_click.svg b/toonz/sources/toonz/Resources/frameprev_click.svg index 09efaa6..e56f0d1 100644 --- a/toonz/sources/toonz/Resources/frameprev_click.svg +++ b/toonz/sources/toonz/Resources/frameprev_click.svg @@ -1,39 +1,22 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/frameprev_over.png b/toonz/sources/toonz/Resources/frameprev_over.png deleted file mode 100644 index a98be27..0000000 Binary files a/toonz/sources/toonz/Resources/frameprev_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/frameprev_over.svg b/toonz/sources/toonz/Resources/frameprev_over.svg index a461466..ee23bb7 100644 --- a/toonz/sources/toonz/Resources/frameprev_over.svg +++ b/toonz/sources/toonz/Resources/frameprev_over.svg @@ -1,39 +1,22 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_B.png b/toonz/sources/toonz/Resources/half_B.png deleted file mode 100644 index 9361c07..0000000 Binary files a/toonz/sources/toonz/Resources/half_B.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_B.svg b/toonz/sources/toonz/Resources/half_B.svg new file mode 100644 index 0000000..fef1eae --- /dev/null +++ b/toonz/sources/toonz/Resources/half_B.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_B_click.png b/toonz/sources/toonz/Resources/half_B_click.png deleted file mode 100644 index a830a1c..0000000 Binary files a/toonz/sources/toonz/Resources/half_B_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_B_click.svg b/toonz/sources/toonz/Resources/half_B_click.svg new file mode 100644 index 0000000..5a33c09 --- /dev/null +++ b/toonz/sources/toonz/Resources/half_B_click.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_B_over.png b/toonz/sources/toonz/Resources/half_B_over.png deleted file mode 100644 index d35ce2c..0000000 Binary files a/toonz/sources/toonz/Resources/half_B_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_B_over.svg b/toonz/sources/toonz/Resources/half_B_over.svg new file mode 100644 index 0000000..a1dad7e --- /dev/null +++ b/toonz/sources/toonz/Resources/half_B_over.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_G.png b/toonz/sources/toonz/Resources/half_G.png deleted file mode 100644 index 84f43d6..0000000 Binary files a/toonz/sources/toonz/Resources/half_G.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_G.svg b/toonz/sources/toonz/Resources/half_G.svg new file mode 100644 index 0000000..c66acab --- /dev/null +++ b/toonz/sources/toonz/Resources/half_G.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_G_click.png b/toonz/sources/toonz/Resources/half_G_click.png deleted file mode 100644 index 6fb4e67..0000000 Binary files a/toonz/sources/toonz/Resources/half_G_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_G_click.svg b/toonz/sources/toonz/Resources/half_G_click.svg new file mode 100644 index 0000000..7b2235d --- /dev/null +++ b/toonz/sources/toonz/Resources/half_G_click.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_G_over.png b/toonz/sources/toonz/Resources/half_G_over.png deleted file mode 100644 index ad8548f..0000000 Binary files a/toonz/sources/toonz/Resources/half_G_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_G_over.svg b/toonz/sources/toonz/Resources/half_G_over.svg new file mode 100644 index 0000000..608778d --- /dev/null +++ b/toonz/sources/toonz/Resources/half_G_over.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_R.png b/toonz/sources/toonz/Resources/half_R.png deleted file mode 100644 index 3cb1f46..0000000 Binary files a/toonz/sources/toonz/Resources/half_R.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_R.svg b/toonz/sources/toonz/Resources/half_R.svg new file mode 100644 index 0000000..4f2182e --- /dev/null +++ b/toonz/sources/toonz/Resources/half_R.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_R_click.png b/toonz/sources/toonz/Resources/half_R_click.png deleted file mode 100644 index 07a26fb..0000000 Binary files a/toonz/sources/toonz/Resources/half_R_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_R_click.svg b/toonz/sources/toonz/Resources/half_R_click.svg new file mode 100644 index 0000000..71d4de6 --- /dev/null +++ b/toonz/sources/toonz/Resources/half_R_click.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_R_over.png b/toonz/sources/toonz/Resources/half_R_over.png deleted file mode 100644 index b3f61bc..0000000 Binary files a/toonz/sources/toonz/Resources/half_R_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_R_over.svg b/toonz/sources/toonz/Resources/half_R_over.svg new file mode 100644 index 0000000..64c761d --- /dev/null +++ b/toonz/sources/toonz/Resources/half_R_over.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_bw.png b/toonz/sources/toonz/Resources/half_bw.png deleted file mode 100644 index c39240a..0000000 Binary files a/toonz/sources/toonz/Resources/half_bw.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_bw.svg b/toonz/sources/toonz/Resources/half_bw.svg new file mode 100644 index 0000000..3afb63d --- /dev/null +++ b/toonz/sources/toonz/Resources/half_bw.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_bw_click.png b/toonz/sources/toonz/Resources/half_bw_click.png deleted file mode 100644 index 8f6c1dd..0000000 Binary files a/toonz/sources/toonz/Resources/half_bw_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_bw_click.svg b/toonz/sources/toonz/Resources/half_bw_click.svg new file mode 100644 index 0000000..c13bc65 --- /dev/null +++ b/toonz/sources/toonz/Resources/half_bw_click.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/half_bw_over.png b/toonz/sources/toonz/Resources/half_bw_over.png deleted file mode 100644 index 2d1291e..0000000 Binary files a/toonz/sources/toonz/Resources/half_bw_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/half_bw_over.svg b/toonz/sources/toonz/Resources/half_bw_over.svg new file mode 100644 index 0000000..eacd1e1 --- /dev/null +++ b/toonz/sources/toonz/Resources/half_bw_over.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/histograms.svg b/toonz/sources/toonz/Resources/histograms.svg new file mode 100644 index 0000000..29ecf29 --- /dev/null +++ b/toonz/sources/toonz/Resources/histograms.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/histograms_click.svg b/toonz/sources/toonz/Resources/histograms_click.svg new file mode 100644 index 0000000..927b21b --- /dev/null +++ b/toonz/sources/toonz/Resources/histograms_click.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/histograms_over.svg b/toonz/sources/toonz/Resources/histograms_over.svg new file mode 100644 index 0000000..5356a5c --- /dev/null +++ b/toonz/sources/toonz/Resources/histograms_over.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/load_off.png b/toonz/sources/toonz/Resources/load_off.png deleted file mode 100644 index 6cb4e5a..0000000 Binary files a/toonz/sources/toonz/Resources/load_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/load_off.svg b/toonz/sources/toonz/Resources/load_off.svg new file mode 100644 index 0000000..540ba14 --- /dev/null +++ b/toonz/sources/toonz/Resources/load_off.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/load_on.png b/toonz/sources/toonz/Resources/load_on.png deleted file mode 100644 index 212aa55..0000000 Binary files a/toonz/sources/toonz/Resources/load_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/load_on.svg b/toonz/sources/toonz/Resources/load_on.svg new file mode 100644 index 0000000..0a34e34 --- /dev/null +++ b/toonz/sources/toonz/Resources/load_on.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/locator.png b/toonz/sources/toonz/Resources/locator.png deleted file mode 100644 index 439df63..0000000 Binary files a/toonz/sources/toonz/Resources/locator.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/locator.svg b/toonz/sources/toonz/Resources/locator.svg new file mode 100644 index 0000000..09ec776 --- /dev/null +++ b/toonz/sources/toonz/Resources/locator.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/locator_click.png b/toonz/sources/toonz/Resources/locator_click.png deleted file mode 100644 index 8045221..0000000 Binary files a/toonz/sources/toonz/Resources/locator_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/locator_click.svg b/toonz/sources/toonz/Resources/locator_click.svg new file mode 100644 index 0000000..289b49b --- /dev/null +++ b/toonz/sources/toonz/Resources/locator_click.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/locator_over.png b/toonz/sources/toonz/Resources/locator_over.png deleted file mode 100644 index 8045221..0000000 Binary files a/toonz/sources/toonz/Resources/locator_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/locator_over.svg b/toonz/sources/toonz/Resources/locator_over.svg new file mode 100644 index 0000000..1318919 --- /dev/null +++ b/toonz/sources/toonz/Resources/locator_over.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/loop.png b/toonz/sources/toonz/Resources/loop.png deleted file mode 100644 index b2f612c..0000000 Binary files a/toonz/sources/toonz/Resources/loop.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/loop.svg b/toonz/sources/toonz/Resources/loop.svg index 0fd7774..b8bd788 100644 --- a/toonz/sources/toonz/Resources/loop.svg +++ b/toonz/sources/toonz/Resources/loop.svg @@ -1,50 +1,17 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/toonz/sources/toonz/Resources/loop_click.png b/toonz/sources/toonz/Resources/loop_click.png deleted file mode 100644 index 61c53b4..0000000 Binary files a/toonz/sources/toonz/Resources/loop_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/loop_click.svg b/toonz/sources/toonz/Resources/loop_click.svg index dbb1ba9..347556f 100644 --- a/toonz/sources/toonz/Resources/loop_click.svg +++ b/toonz/sources/toonz/Resources/loop_click.svg @@ -1,50 +1,21 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/loop_over.png b/toonz/sources/toonz/Resources/loop_over.png deleted file mode 100644 index 61c53b4..0000000 Binary files a/toonz/sources/toonz/Resources/loop_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/loop_over.svg b/toonz/sources/toonz/Resources/loop_over.svg index dbb1ba9..778309a 100644 --- a/toonz/sources/toonz/Resources/loop_over.svg +++ b/toonz/sources/toonz/Resources/loop_over.svg @@ -1,50 +1,21 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/missing.png b/toonz/sources/toonz/Resources/missing.png deleted file mode 100644 index 7f6199f..0000000 Binary files a/toonz/sources/toonz/Resources/missing.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/missing.svg b/toonz/sources/toonz/Resources/missing.svg new file mode 100644 index 0000000..3a3c61f --- /dev/null +++ b/toonz/sources/toonz/Resources/missing.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + ? + + diff --git a/toonz/sources/toonz/Resources/miter_join.png b/toonz/sources/toonz/Resources/miter_join.png deleted file mode 100644 index 994d12a..0000000 Binary files a/toonz/sources/toonz/Resources/miter_join.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/miter_join.svg b/toonz/sources/toonz/Resources/miter_join.svg new file mode 100644 index 0000000..4b6eb5c --- /dev/null +++ b/toonz/sources/toonz/Resources/miter_join.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/newmemo.png b/toonz/sources/toonz/Resources/newmemo.png deleted file mode 100644 index 8d56006..0000000 Binary files a/toonz/sources/toonz/Resources/newmemo.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/newmemo.svg b/toonz/sources/toonz/Resources/newmemo.svg new file mode 100644 index 0000000..3388f47 --- /dev/null +++ b/toonz/sources/toonz/Resources/newmemo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/newmemo_disabled.png b/toonz/sources/toonz/Resources/newmemo_disabled.png deleted file mode 100644 index 5336171..0000000 Binary files a/toonz/sources/toonz/Resources/newmemo_disabled.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/newmemo_disabled.svg b/toonz/sources/toonz/Resources/newmemo_disabled.svg new file mode 100644 index 0000000..f707bac --- /dev/null +++ b/toonz/sources/toonz/Resources/newmemo_disabled.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/newpage.png b/toonz/sources/toonz/Resources/newpage.png deleted file mode 100644 index c40780f..0000000 Binary files a/toonz/sources/toonz/Resources/newpage.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/newpage_over.png b/toonz/sources/toonz/Resources/newpage_over.png deleted file mode 100644 index 96c4534..0000000 Binary files a/toonz/sources/toonz/Resources/newpage_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/no_mypaintbrush.png b/toonz/sources/toonz/Resources/no_mypaintbrush.png new file mode 100644 index 0000000..b6f2963 Binary files /dev/null and b/toonz/sources/toonz/Resources/no_mypaintbrush.png differ diff --git a/toonz/sources/toonz/Resources/pause.png b/toonz/sources/toonz/Resources/pause.png deleted file mode 100644 index b99784e..0000000 Binary files a/toonz/sources/toonz/Resources/pause.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/pause.svg b/toonz/sources/toonz/Resources/pause.svg index ac525f9..44f3bf7 100644 --- a/toonz/sources/toonz/Resources/pause.svg +++ b/toonz/sources/toonz/Resources/pause.svg @@ -1,39 +1,22 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/pause_click.png b/toonz/sources/toonz/Resources/pause_click.png deleted file mode 100644 index bbf2422..0000000 Binary files a/toonz/sources/toonz/Resources/pause_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/pause_click.svg b/toonz/sources/toonz/Resources/pause_click.svg index e56d71b..95fdd44 100644 --- a/toonz/sources/toonz/Resources/pause_click.svg +++ b/toonz/sources/toonz/Resources/pause_click.svg @@ -1,39 +1,22 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/pause_disabled.png b/toonz/sources/toonz/Resources/pause_disabled.png deleted file mode 100644 index d7241fc..0000000 Binary files a/toonz/sources/toonz/Resources/pause_disabled.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/pause_disabled.svg b/toonz/sources/toonz/Resources/pause_disabled.svg new file mode 100644 index 0000000..cacde7e --- /dev/null +++ b/toonz/sources/toonz/Resources/pause_disabled.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/pause_over.png b/toonz/sources/toonz/Resources/pause_over.png deleted file mode 100644 index bbf2422..0000000 Binary files a/toonz/sources/toonz/Resources/pause_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/pause_over.svg b/toonz/sources/toonz/Resources/pause_over.svg index e56d71b..8454058 100644 --- a/toonz/sources/toonz/Resources/pause_over.svg +++ b/toonz/sources/toonz/Resources/pause_over.svg @@ -1,39 +1,22 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/play.png b/toonz/sources/toonz/Resources/play.png deleted file mode 100644 index cc7b4f3..0000000 Binary files a/toonz/sources/toonz/Resources/play.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/play.svg b/toonz/sources/toonz/Resources/play.svg index 7eb4b20..82acb02 100644 --- a/toonz/sources/toonz/Resources/play.svg +++ b/toonz/sources/toonz/Resources/play.svg @@ -1,37 +1,15 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/toonz/sources/toonz/Resources/play_click.png b/toonz/sources/toonz/Resources/play_click.png deleted file mode 100644 index a8a6219..0000000 Binary files a/toonz/sources/toonz/Resources/play_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/play_click.svg b/toonz/sources/toonz/Resources/play_click.svg index 9180fdf..c63628d 100644 --- a/toonz/sources/toonz/Resources/play_click.svg +++ b/toonz/sources/toonz/Resources/play_click.svg @@ -1,37 +1,13 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + diff --git a/toonz/sources/toonz/Resources/play_disabled.png b/toonz/sources/toonz/Resources/play_disabled.png deleted file mode 100644 index 2471d45..0000000 Binary files a/toonz/sources/toonz/Resources/play_disabled.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/play_disabled.svg b/toonz/sources/toonz/Resources/play_disabled.svg new file mode 100644 index 0000000..4ebac08 --- /dev/null +++ b/toonz/sources/toonz/Resources/play_disabled.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/play_over.png b/toonz/sources/toonz/Resources/play_over.png deleted file mode 100644 index a8a6219..0000000 Binary files a/toonz/sources/toonz/Resources/play_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/play_over.svg b/toonz/sources/toonz/Resources/play_over.svg index 9180fdf..74d1d0c 100644 --- a/toonz/sources/toonz/Resources/play_over.svg +++ b/toonz/sources/toonz/Resources/play_over.svg @@ -1,37 +1,15 @@ - - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/toonz/sources/toonz/Resources/projecting_cap.png b/toonz/sources/toonz/Resources/projecting_cap.png deleted file mode 100644 index 43e417f..0000000 Binary files a/toonz/sources/toonz/Resources/projecting_cap.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/projecting_cap.svg b/toonz/sources/toonz/Resources/projecting_cap.svg new file mode 100644 index 0000000..8c1b8d3 --- /dev/null +++ b/toonz/sources/toonz/Resources/projecting_cap.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/record.png b/toonz/sources/toonz/Resources/record.png deleted file mode 100644 index b58f39d..0000000 Binary files a/toonz/sources/toonz/Resources/record.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/record.svg b/toonz/sources/toonz/Resources/record.svg new file mode 100644 index 0000000..847106d --- /dev/null +++ b/toonz/sources/toonz/Resources/record.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/record_click.png b/toonz/sources/toonz/Resources/record_click.png deleted file mode 100644 index b58f39d..0000000 Binary files a/toonz/sources/toonz/Resources/record_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/record_click.svg b/toonz/sources/toonz/Resources/record_click.svg new file mode 100644 index 0000000..7254c7f --- /dev/null +++ b/toonz/sources/toonz/Resources/record_click.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/record_disabled.png b/toonz/sources/toonz/Resources/record_disabled.png deleted file mode 100644 index e52c1af..0000000 Binary files a/toonz/sources/toonz/Resources/record_disabled.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/record_disabled.svg b/toonz/sources/toonz/Resources/record_disabled.svg new file mode 100644 index 0000000..d74dcfb --- /dev/null +++ b/toonz/sources/toonz/Resources/record_disabled.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/record_over.png b/toonz/sources/toonz/Resources/record_over.png deleted file mode 100644 index b58f39d..0000000 Binary files a/toonz/sources/toonz/Resources/record_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/record_over.svg b/toonz/sources/toonz/Resources/record_over.svg new file mode 100644 index 0000000..8e19fa6 --- /dev/null +++ b/toonz/sources/toonz/Resources/record_over.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/refresh.png b/toonz/sources/toonz/Resources/refresh.png deleted file mode 100644 index ac100b8..0000000 Binary files a/toonz/sources/toonz/Resources/refresh.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/refresh.svg b/toonz/sources/toonz/Resources/refresh.svg new file mode 100644 index 0000000..a884f38 --- /dev/null +++ b/toonz/sources/toonz/Resources/refresh.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/refresh_over.png b/toonz/sources/toonz/Resources/refresh_over.png deleted file mode 100644 index 987448e..0000000 Binary files a/toonz/sources/toonz/Resources/refresh_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/refresh_over.svg b/toonz/sources/toonz/Resources/refresh_over.svg new file mode 100644 index 0000000..4168460 --- /dev/null +++ b/toonz/sources/toonz/Resources/refresh_over.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/render_computing.png b/toonz/sources/toonz/Resources/render_computing.png deleted file mode 100644 index 44d3c75..0000000 Binary files a/toonz/sources/toonz/Resources/render_computing.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/render_computing.svg b/toonz/sources/toonz/Resources/render_computing.svg new file mode 100644 index 0000000..d7a2abd --- /dev/null +++ b/toonz/sources/toonz/Resources/render_computing.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/render_done.png b/toonz/sources/toonz/Resources/render_done.png deleted file mode 100644 index c916027..0000000 Binary files a/toonz/sources/toonz/Resources/render_done.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/render_done.svg b/toonz/sources/toonz/Resources/render_done.svg new file mode 100644 index 0000000..fa4039b --- /dev/null +++ b/toonz/sources/toonz/Resources/render_done.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/render_done_with_errors.png b/toonz/sources/toonz/Resources/render_done_with_errors.png deleted file mode 100644 index 476d12d..0000000 Binary files a/toonz/sources/toonz/Resources/render_done_with_errors.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/render_done_with_errors.svg b/toonz/sources/toonz/Resources/render_done_with_errors.svg new file mode 100644 index 0000000..a019c16 --- /dev/null +++ b/toonz/sources/toonz/Resources/render_done_with_errors.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/render_failed.png b/toonz/sources/toonz/Resources/render_failed.png deleted file mode 100644 index ae99eb5..0000000 Binary files a/toonz/sources/toonz/Resources/render_failed.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/render_failed.svg b/toonz/sources/toonz/Resources/render_failed.svg new file mode 100644 index 0000000..a4a6044 --- /dev/null +++ b/toonz/sources/toonz/Resources/render_failed.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/render_suspended.png b/toonz/sources/toonz/Resources/render_suspended.png deleted file mode 100644 index fa751f9..0000000 Binary files a/toonz/sources/toonz/Resources/render_suspended.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/render_suspended.svg b/toonz/sources/toonz/Resources/render_suspended.svg new file mode 100644 index 0000000..274dc8a --- /dev/null +++ b/toonz/sources/toonz/Resources/render_suspended.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/round_cap.png b/toonz/sources/toonz/Resources/round_cap.png deleted file mode 100644 index 85a3142..0000000 Binary files a/toonz/sources/toonz/Resources/round_cap.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/round_cap.svg b/toonz/sources/toonz/Resources/round_cap.svg new file mode 100644 index 0000000..bb153dd --- /dev/null +++ b/toonz/sources/toonz/Resources/round_cap.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/round_join.png b/toonz/sources/toonz/Resources/round_join.png deleted file mode 100644 index 877e443..0000000 Binary files a/toonz/sources/toonz/Resources/round_join.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/round_join.svg b/toonz/sources/toonz/Resources/round_join.svg new file mode 100644 index 0000000..f25f7cc --- /dev/null +++ b/toonz/sources/toonz/Resources/round_join.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/save_off.png b/toonz/sources/toonz/Resources/save_off.png deleted file mode 100644 index 0d0742b..0000000 Binary files a/toonz/sources/toonz/Resources/save_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/save_off.svg b/toonz/sources/toonz/Resources/save_off.svg new file mode 100644 index 0000000..7ee9aad --- /dev/null +++ b/toonz/sources/toonz/Resources/save_off.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/save_on.png b/toonz/sources/toonz/Resources/save_on.png deleted file mode 100644 index 9d7360f..0000000 Binary files a/toonz/sources/toonz/Resources/save_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/save_on.svg b/toonz/sources/toonz/Resources/save_on.svg new file mode 100644 index 0000000..d0a628e --- /dev/null +++ b/toonz/sources/toonz/Resources/save_on.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/saveas_off.png b/toonz/sources/toonz/Resources/saveas_off.png deleted file mode 100644 index c41cbde..0000000 Binary files a/toonz/sources/toonz/Resources/saveas_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/saveas_off.svg b/toonz/sources/toonz/Resources/saveas_off.svg new file mode 100644 index 0000000..ac0100c --- /dev/null +++ b/toonz/sources/toonz/Resources/saveas_off.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/saveas_on.png b/toonz/sources/toonz/Resources/saveas_on.png deleted file mode 100644 index ad7cdb9..0000000 Binary files a/toonz/sources/toonz/Resources/saveas_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/saveas_on.svg b/toonz/sources/toonz/Resources/saveas_on.svg new file mode 100644 index 0000000..7edd6f6 --- /dev/null +++ b/toonz/sources/toonz/Resources/saveas_on.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/snapshot.png b/toonz/sources/toonz/Resources/snapshot.png deleted file mode 100644 index d479c49..0000000 Binary files a/toonz/sources/toonz/Resources/snapshot.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/snapshot.svg b/toonz/sources/toonz/Resources/snapshot.svg new file mode 100644 index 0000000..e8b2ad3 --- /dev/null +++ b/toonz/sources/toonz/Resources/snapshot.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/snapshot_click.png b/toonz/sources/toonz/Resources/snapshot_click.png deleted file mode 100644 index 249d3ec..0000000 Binary files a/toonz/sources/toonz/Resources/snapshot_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/snapshot_click.svg b/toonz/sources/toonz/Resources/snapshot_click.svg new file mode 100644 index 0000000..9c9d1da --- /dev/null +++ b/toonz/sources/toonz/Resources/snapshot_click.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/snapshot_over.png b/toonz/sources/toonz/Resources/snapshot_over.png deleted file mode 100644 index d479c49..0000000 Binary files a/toonz/sources/toonz/Resources/snapshot_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/snapshot_over.svg b/toonz/sources/toonz/Resources/snapshot_over.svg new file mode 100644 index 0000000..2875a1d --- /dev/null +++ b/toonz/sources/toonz/Resources/snapshot_over.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/sound.png b/toonz/sources/toonz/Resources/sound.png deleted file mode 100644 index ee6c741..0000000 Binary files a/toonz/sources/toonz/Resources/sound.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/sound.svg b/toonz/sources/toonz/Resources/sound.svg new file mode 100644 index 0000000..656769f --- /dev/null +++ b/toonz/sources/toonz/Resources/sound.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/sound_click.png b/toonz/sources/toonz/Resources/sound_click.png deleted file mode 100644 index a88cb27..0000000 Binary files a/toonz/sources/toonz/Resources/sound_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/sound_click.svg b/toonz/sources/toonz/Resources/sound_click.svg new file mode 100644 index 0000000..9c52db4 --- /dev/null +++ b/toonz/sources/toonz/Resources/sound_click.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/sound_over.png b/toonz/sources/toonz/Resources/sound_over.png deleted file mode 100644 index 2562a90..0000000 Binary files a/toonz/sources/toonz/Resources/sound_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/sound_over.svg b/toonz/sources/toonz/Resources/sound_over.svg new file mode 100644 index 0000000..ced895f --- /dev/null +++ b/toonz/sources/toonz/Resources/sound_over.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/splash.png b/toonz/sources/toonz/Resources/splash.png deleted file mode 100644 index 0a9395a..0000000 Binary files a/toonz/sources/toonz/Resources/splash.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/splash.svg b/toonz/sources/toonz/Resources/splash.svg new file mode 100644 index 0000000..644175b --- /dev/null +++ b/toonz/sources/toonz/Resources/splash.svg @@ -0,0 +1,802 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/start_off.png b/toonz/sources/toonz/Resources/start_off.png deleted file mode 100644 index 6eb60d7..0000000 Binary files a/toonz/sources/toonz/Resources/start_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/start_off.svg b/toonz/sources/toonz/Resources/start_off.svg new file mode 100644 index 0000000..8cdb0d0 --- /dev/null +++ b/toonz/sources/toonz/Resources/start_off.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/start_on.png b/toonz/sources/toonz/Resources/start_on.png deleted file mode 100644 index fea99a5..0000000 Binary files a/toonz/sources/toonz/Resources/start_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/start_on.svg b/toonz/sources/toonz/Resources/start_on.svg new file mode 100644 index 0000000..51d23e0 --- /dev/null +++ b/toonz/sources/toonz/Resources/start_on.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/stop.png b/toonz/sources/toonz/Resources/stop.png deleted file mode 100644 index 8bf569a..0000000 Binary files a/toonz/sources/toonz/Resources/stop.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/stop.svg b/toonz/sources/toonz/Resources/stop.svg new file mode 100644 index 0000000..04e734d --- /dev/null +++ b/toonz/sources/toonz/Resources/stop.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/stop_click.png b/toonz/sources/toonz/Resources/stop_click.png deleted file mode 100644 index 8bf569a..0000000 Binary files a/toonz/sources/toonz/Resources/stop_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/stop_click.svg b/toonz/sources/toonz/Resources/stop_click.svg new file mode 100644 index 0000000..e17a4ff --- /dev/null +++ b/toonz/sources/toonz/Resources/stop_click.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/stop_disabled.png b/toonz/sources/toonz/Resources/stop_disabled.png deleted file mode 100644 index 4924e9a..0000000 Binary files a/toonz/sources/toonz/Resources/stop_disabled.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/stop_disabled.svg b/toonz/sources/toonz/Resources/stop_disabled.svg new file mode 100644 index 0000000..01864de --- /dev/null +++ b/toonz/sources/toonz/Resources/stop_disabled.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/stop_off.png b/toonz/sources/toonz/Resources/stop_off.png deleted file mode 100644 index 6048019..0000000 Binary files a/toonz/sources/toonz/Resources/stop_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/stop_off.svg b/toonz/sources/toonz/Resources/stop_off.svg new file mode 100644 index 0000000..372bf61 --- /dev/null +++ b/toonz/sources/toonz/Resources/stop_off.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/toonz/sources/toonz/Resources/stop_on.png b/toonz/sources/toonz/Resources/stop_on.png deleted file mode 100644 index bef4134..0000000 Binary files a/toonz/sources/toonz/Resources/stop_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/stop_on.svg b/toonz/sources/toonz/Resources/stop_on.svg new file mode 100644 index 0000000..101d753 --- /dev/null +++ b/toonz/sources/toonz/Resources/stop_on.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/toonz/sources/toonz/Resources/stop_over.png b/toonz/sources/toonz/Resources/stop_over.png deleted file mode 100644 index 8bf569a..0000000 Binary files a/toonz/sources/toonz/Resources/stop_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/stop_over.svg b/toonz/sources/toonz/Resources/stop_over.svg new file mode 100644 index 0000000..94c6507 --- /dev/null +++ b/toonz/sources/toonz/Resources/stop_over.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/swap_off.png b/toonz/sources/toonz/Resources/swap_off.png deleted file mode 100644 index 6ba43b4..0000000 Binary files a/toonz/sources/toonz/Resources/swap_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/swap_off.svg b/toonz/sources/toonz/Resources/swap_off.svg new file mode 100644 index 0000000..9cc7c66 --- /dev/null +++ b/toonz/sources/toonz/Resources/swap_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/swap_on.png b/toonz/sources/toonz/Resources/swap_on.png deleted file mode 100644 index 63b0a7e..0000000 Binary files a/toonz/sources/toonz/Resources/swap_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/swap_on.svg b/toonz/sources/toonz/Resources/swap_on.svg new file mode 100644 index 0000000..0cb56c3 --- /dev/null +++ b/toonz/sources/toonz/Resources/swap_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/use_subcamera_preview.png b/toonz/sources/toonz/Resources/use_subcamera_preview.png deleted file mode 100644 index f6ee8be..0000000 Binary files a/toonz/sources/toonz/Resources/use_subcamera_preview.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/use_subcamera_preview.svg b/toonz/sources/toonz/Resources/use_subcamera_preview.svg new file mode 100644 index 0000000..fdbc7d5 --- /dev/null +++ b/toonz/sources/toonz/Resources/use_subcamera_preview.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/use_subcamera_preview_click.png b/toonz/sources/toonz/Resources/use_subcamera_preview_click.png deleted file mode 100644 index 935b359..0000000 Binary files a/toonz/sources/toonz/Resources/use_subcamera_preview_click.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/use_subcamera_preview_click.svg b/toonz/sources/toonz/Resources/use_subcamera_preview_click.svg new file mode 100644 index 0000000..1918304 --- /dev/null +++ b/toonz/sources/toonz/Resources/use_subcamera_preview_click.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/use_subcamera_preview_over.png b/toonz/sources/toonz/Resources/use_subcamera_preview_over.png deleted file mode 100644 index 6136a92..0000000 Binary files a/toonz/sources/toonz/Resources/use_subcamera_preview_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/use_subcamera_preview_over.svg b/toonz/sources/toonz/Resources/use_subcamera_preview_over.svg new file mode 100644 index 0000000..6176434 --- /dev/null +++ b/toonz/sources/toonz/Resources/use_subcamera_preview_over.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/viewicon_off.png b/toonz/sources/toonz/Resources/viewicon_off.png deleted file mode 100644 index 962447c..0000000 Binary files a/toonz/sources/toonz/Resources/viewicon_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/viewicon_off.svg b/toonz/sources/toonz/Resources/viewicon_off.svg new file mode 100644 index 0000000..57d8874 --- /dev/null +++ b/toonz/sources/toonz/Resources/viewicon_off.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/viewicon_on.png b/toonz/sources/toonz/Resources/viewicon_on.png deleted file mode 100644 index 6f069d0..0000000 Binary files a/toonz/sources/toonz/Resources/viewicon_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/viewicon_on.svg b/toonz/sources/toonz/Resources/viewicon_on.svg new file mode 100644 index 0000000..a4229c7 --- /dev/null +++ b/toonz/sources/toonz/Resources/viewicon_on.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/viewicon_over.png b/toonz/sources/toonz/Resources/viewicon_over.png deleted file mode 100644 index 5a5b8c3..0000000 Binary files a/toonz/sources/toonz/Resources/viewicon_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/viewicon_over.svg b/toonz/sources/toonz/Resources/viewicon_over.svg new file mode 100644 index 0000000..e962264 --- /dev/null +++ b/toonz/sources/toonz/Resources/viewicon_over.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/viewlist_off.png b/toonz/sources/toonz/Resources/viewlist_off.png deleted file mode 100644 index 4493174..0000000 Binary files a/toonz/sources/toonz/Resources/viewlist_off.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/viewlist_off.svg b/toonz/sources/toonz/Resources/viewlist_off.svg new file mode 100644 index 0000000..3b99e3b --- /dev/null +++ b/toonz/sources/toonz/Resources/viewlist_off.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/viewlist_on.png b/toonz/sources/toonz/Resources/viewlist_on.png deleted file mode 100644 index d7dffa2..0000000 Binary files a/toonz/sources/toonz/Resources/viewlist_on.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/viewlist_on.svg b/toonz/sources/toonz/Resources/viewlist_on.svg new file mode 100644 index 0000000..db105ba --- /dev/null +++ b/toonz/sources/toonz/Resources/viewlist_on.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/Resources/viewlist_over.png b/toonz/sources/toonz/Resources/viewlist_over.png deleted file mode 100644 index 77315ad..0000000 Binary files a/toonz/sources/toonz/Resources/viewlist_over.png and /dev/null differ diff --git a/toonz/sources/toonz/Resources/viewlist_over.svg b/toonz/sources/toonz/Resources/viewlist_over.svg new file mode 100644 index 0000000..8400456 --- /dev/null +++ b/toonz/sources/toonz/Resources/viewlist_over.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonz/audiorecordingpopup.cpp b/toonz/sources/toonz/audiorecordingpopup.cpp index 69ae7c7..9a38077 100644 --- a/toonz/sources/toonz/audiorecordingpopup.cpp +++ b/toonz/sources/toonz/audiorecordingpopup.cpp @@ -86,23 +86,27 @@ AudioRecordingPopup::AudioRecordingPopup() m_pauseRecordingButton->setMaximumWidth(25); m_pausePlaybackButton->setMaximumWidth(25); - QString playDisabled = QString(":Resources/play_disabled.png"); - QString pauseDisabled = QString(":Resources/pause_disabled.png"); - QString stopDisabled = QString(":Resources/stop_disabled.png"); - QString recordDisabled = QString(":Resources/record_disabled.png"); + QString playDisabled = QString(":Resources/play_disabled.svg"); + QString pauseDisabled = QString(":Resources/pause_disabled.svg"); + QString stopDisabled = QString(":Resources/stop_disabled.svg"); + QString recordDisabled = QString(":Resources/record_disabled.svg"); - m_pauseIcon = createQIconPNG("pause"); + m_pauseIcon = createQIcon("pause"); m_pauseIcon.addFile(pauseDisabled, QSize(), QIcon::Disabled); - m_playIcon = createQIconPNG("play"); + m_playIcon = createQIcon("play"); m_playIcon.addFile(playDisabled, QSize(), QIcon::Disabled); - m_recordIcon = createQIconPNG("record"); + m_recordIcon = createQIcon("record"); m_recordIcon.addFile(recordDisabled, QSize(), QIcon::Disabled); - m_stopIcon = createQIconPNG("stop"); + m_stopIcon = createQIcon("stop"); m_stopIcon.addFile(stopDisabled, QSize(), QIcon::Disabled); m_pauseRecordingButton->setIcon(m_pauseIcon); + m_pauseRecordingButton->setIconSize(QSize(17, 17)); m_playButton->setIcon(m_playIcon); + m_playButton->setIconSize(QSize(17, 17)); m_recordButton->setIcon(m_recordIcon); + m_recordButton->setIconSize(QSize(17, 17)); m_pausePlaybackButton->setIcon(m_pauseIcon); + m_pausePlaybackButton->setIconSize(QSize(17, 17)); QStringList inputs = m_audioRecorder->audioInputs(); m_deviceListCB->addItems(inputs); diff --git a/toonz/sources/toonz/cellselection.cpp b/toonz/sources/toonz/cellselection.cpp index 0f3e74a..f5aa372 100644 --- a/toonz/sources/toonz/cellselection.cpp +++ b/toonz/sources/toonz/cellselection.cpp @@ -1586,7 +1586,7 @@ void TCellSelection::deleteCells() { getSelectedCells(r0, c0, r1, c1); TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); // if all the selected cells are already empty, then do nothing - if (xsh->isRectEmpty(r0, c0, r1, c1)) return; + if (xsh->isRectEmpty(CellPosition(r0, c0), CellPosition(r1, c1))) return; TCellData *data = new TCellData(); data->setCells(xsh, r0, c0, r1, c1); DeleteCellsUndo *undo = diff --git a/toonz/sources/toonz/columnselection.cpp b/toonz/sources/toonz/columnselection.cpp index 530bd7f..ad905e0 100644 --- a/toonz/sources/toonz/columnselection.cpp +++ b/toonz/sources/toonz/columnselection.cpp @@ -16,6 +16,7 @@ #include "toonz/txshleveltypes.h" #include "toonz/txshsimplelevel.h" #include "toonz/txshcell.h" +#include "orientation.h" // TnzCore includes #include "tvectorimage.h" @@ -201,10 +202,13 @@ void TColumnSelection::cloneChild() { //----------------------------------------------------------------------------- void TColumnSelection::hideColumns() { - TApp *app = TApp::instance(); - ColumnFan *columnFan = app->getCurrentXsheet()->getXsheet()->getColumnFan(); - std::set::iterator it = m_indices.begin(); - for (; it != m_indices.end(); ++it) columnFan->deactivate(*it); + TApp *app = TApp::instance(); + for (auto o : Orientations::all()) { + ColumnFan *columnFan = + app->getCurrentXsheet()->getXsheet()->getColumnFan(o); + std::set::iterator it = m_indices.begin(); + for (; it != m_indices.end(); ++it) columnFan->deactivate(*it); + } m_indices.clear(); app->getCurrentXsheet()->notifyXsheetChanged(); // DA FARE (non c'e una notica per il solo cambiamento della testa delle diff --git a/toonz/sources/toonz/comboviewerpane.cpp b/toonz/sources/toonz/comboviewerpane.cpp index 5caadc5..05bd8b7 100644 --- a/toonz/sources/toonz/comboviewerpane.cpp +++ b/toonz/sources/toonz/comboviewerpane.cpp @@ -321,16 +321,13 @@ void ComboViewerPanel::onDrawFrame( assert(frame >= 0); if (frame != frameHandle->getFrameIndex() + 1) { - if (frameHandle->isEditingScene()) { - TXshColumn *column = app->getCurrentXsheet()->getXsheet()->getColumn( - app->getCurrentColumn()->getColumnIndex()); - if (column) { - TXshSoundColumn *soundColumn = column->getSoundColumn(); - if (soundColumn && !soundColumn->isPlaying()) - app->getCurrentFrame()->scrubColumn(frame, frame, soundColumn); - } - } + int oldFrame = frameHandle->getFrame(); frameHandle->setCurrentFrame(frame); + if (!frameHandle->isPlaying() && !frameHandle->isEditingLevel() && + oldFrame != frameHandle->getFrame()) + frameHandle->scrubXsheet( + frame - 1, frame - 1, + TApp::instance()->getCurrentXsheet()->getXsheet()); } else if (settings.m_blankColor != TPixel::Transparent) @@ -384,7 +381,8 @@ void ComboViewerPanel::showEvent(QShowEvent *event) { // onXshLevelSwitched(TXshLevel*): changeWindowTitle() + updateFrameRange() ret = ret && connect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), this, SLOT(onXshLevelSwitched(TXshLevel *))); - + ret = ret && connect(levelHandle, SIGNAL(xshLevelTitleChanged()), this, + SLOT(changeWindowTitle())); // updateFrameRange(): update the frame slider's range ret = ret && connect(levelHandle, SIGNAL(xshLevelChanged()), this, SLOT(updateFrameRange())); @@ -414,12 +412,14 @@ void ComboViewerPanel::showEvent(QShowEvent *event) { void ComboViewerPanel::hideEvent(QHideEvent *event) { StyleShortcutSwitchablePanel::hideEvent(event); TApp *app = TApp::instance(); - disconnect(app->getCurrentScene()); - disconnect(app->getCurrentLevel()); - disconnect(app->getCurrentFrame()); - disconnect(app->getCurrentObject()); - disconnect(app->getCurrentXsheet()); - disconnect(app->getCurrentTool()); + disconnect(app->getCurrentFrame(), 0, this, 0); + disconnect(app->getCurrentScene(), 0, this, 0); + disconnect(app->getCurrentLevel(), 0, this, 0); + disconnect(app->getCurrentObject(), 0, this, 0); + disconnect(app->getCurrentXsheet(), 0, this, 0); + + disconnect(app->getCurrentTool(), SIGNAL(toolSwitched()), m_sceneViewer, + SLOT(onToolSwitched())); m_flipConsole->setActive(false); } @@ -714,14 +714,14 @@ void ComboViewerPanel::onSceneChanged() { int frameIndex = fh->getFrameIndex(); int maxFrameIndex = fh->getMaxFrameIndex(); if (frameIndex > maxFrameIndex) maxFrameIndex = frameIndex; - - // set the FPS for new scene + // update fps only when the scene settings is changed m_flipConsole->setFrameRate(TApp::instance() ->getCurrentScene() ->getScene() ->getProperties() ->getOutputProperties() - ->getFrameRate()); + ->getFrameRate(), + false); // update the frame slider's range with new frameHandle m_flipConsole->setFrameRange(1, maxFrameIndex + 1, 1, frameIndex + 1); @@ -744,6 +744,12 @@ void ComboViewerPanel::onSceneSwitched() { enableFlipConsoleForCamerastand(false); m_sceneViewer->enablePreview(SceneViewer::NO_PREVIEW); m_flipConsole->setChecked(FlipConsole::eDefineSubCamera, false); + m_flipConsole->setFrameRate(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProperties() + ->getOutputProperties() + ->getFrameRate()); m_sceneViewer->setEditPreviewSubcamera(false); onSceneChanged(); } @@ -796,21 +802,13 @@ void ComboViewerPanel::onFrameTypeChanged() { //----------------------------------------------------------------------------- -bool ComboViewerPanel::isFrameAlreadyCached(int frame) { - if (m_sceneViewer->isPreviewEnabled()) { - class Previewer *pr = Previewer::instance(); - return pr->isFrameReady(frame - 1); - } else - return true; -} - -//----------------------------------------------------------------------------- - void ComboViewerPanel::onPreferenceChanged(const QString &prefName) { m_flipConsole->onPreferenceChanged(prefName); StyleShortcutSwitchablePanel::onPreferenceChanged(prefName); } +//----------------------------------------------------------------------------- + void ComboViewerPanel::playAudioFrame(int frame) { if (m_first) { m_first = false; @@ -833,6 +831,8 @@ void ComboViewerPanel::playAudioFrame(int frame) { false); } +//----------------------------------------------------------------------------- + bool ComboViewerPanel::hasSoundtrack() { if (m_sound != NULL) { m_sound = NULL; diff --git a/toonz/sources/toonz/comboviewerpane.h b/toonz/sources/toonz/comboviewerpane.h index 14f26e8..b12bef6 100644 --- a/toonz/sources/toonz/comboviewerpane.h +++ b/toonz/sources/toonz/comboviewerpane.h @@ -89,9 +89,6 @@ public: void onDrawFrame(int frame, const ImagePainter::VisualSettings &settings) override; - // reimplementation of FlipConsoleOwner::isFrameAlreadyCached - bool isFrameAlreadyCached(int frame) override; - protected: void showEvent(QShowEvent *) override; void hideEvent(QHideEvent *) override; diff --git a/toonz/sources/toonz/dvitemview.cpp b/toonz/sources/toonz/dvitemview.cpp index a4d55a2..00d780c 100644 --- a/toonz/sources/toonz/dvitemview.cpp +++ b/toonz/sources/toonz/dvitemview.cpp @@ -1022,7 +1022,7 @@ void DvItemViewerPanel::paintThumbnailItem(QPainter &p, int index) { if (!thumbnail.isNull()) p.drawPixmap(iconRect.topLeft(), thumbnail); //} else { - static QPixmap missingPixmap = QPixmap(":Resources/missing.png"); + static QPixmap missingPixmap = QPixmap(":Resources/missing.svg"); QRect pixmapRect(rect.left() + (rect.width() - missingPixmap.width()) / 2, rect.top(), missingPixmap.width(), missingPixmap.height()); p.drawPixmap(pixmapRect.topLeft(), missingPixmap); @@ -1793,24 +1793,20 @@ DvItemViewerButtonBar::DvItemViewerButtonBar(DvItemViewer *itemViewer, QWidget *parent) : QToolBar(parent) { setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - setIconSize(QSize(17, 15)); + setIconSize(QSize(17, 17)); setObjectName("buttonBar"); // buttonBar->setIconSize(QSize(10,10)); - static QPixmap backButtonEnablePM = - QPixmap(":Resources/fb_history_back_enable.png"); - static QPixmap backButtonDisablePM = - QPixmap(":Resources/fb_history_back_disable.png"); - static QPixmap fwdButtonEnablePM = - QPixmap(":Resources/fb_history_fwd_enable.png"); - static QPixmap fwdButtonDisablePM = - QPixmap(":Resources/fb_history_fwd_disable.png"); + QString backButtonEnable = QString(":Resources/fb_history_back_enable.svg"); + QString backButtonDisable = QString(":Resources/fb_history_back_disable.svg"); + QString fwdButtonEnable = QString(":Resources/fb_history_fwd_enable.svg"); + QString fwdButtonDisable = QString(":Resources/fb_history_fwd_disable.svg"); QIcon backButtonIcon, fwdButtonIcon; - backButtonIcon.addPixmap(backButtonEnablePM, QIcon::Normal); - backButtonIcon.addPixmap(backButtonDisablePM, QIcon::Disabled); - fwdButtonIcon.addPixmap(fwdButtonEnablePM, QIcon::Normal); - fwdButtonIcon.addPixmap(fwdButtonDisablePM, QIcon::Disabled); + backButtonIcon.addFile(backButtonEnable, QSize(), QIcon::Normal); + backButtonIcon.addFile(backButtonDisable, QSize(), QIcon::Disabled); + fwdButtonIcon.addFile(fwdButtonEnable, QSize(), QIcon::Normal); + fwdButtonIcon.addFile(fwdButtonDisable, QSize(), QIcon::Disabled); m_folderBack = new QAction(backButtonIcon, tr("Back"), this); m_folderBack->setIconText(""); @@ -1819,13 +1815,13 @@ DvItemViewerButtonBar::DvItemViewerButtonBar(DvItemViewer *itemViewer, m_folderFwd->setIconText(""); addAction(m_folderFwd); - QIcon folderUpIcon = createQIconPNG("folderup"); + QIcon folderUpIcon = createQIcon("folderup"); QAction *folderUp = new QAction(folderUpIcon, tr("Up One Level"), this); folderUp->setIconText(tr("Up")); addAction(folderUp); addSeparator(); - QIcon newFolderIcon = createQIconPNG("newfolder"); + QIcon newFolderIcon = createQIcon("newfolder"); QAction *newFolder = new QAction(newFolderIcon, tr("New Folder"), this); newFolder->setIconText(tr("New")); addAction(newFolder); @@ -1835,7 +1831,7 @@ DvItemViewerButtonBar::DvItemViewerButtonBar(DvItemViewer *itemViewer, QActionGroup *actions = new QActionGroup(this); actions->setExclusive(true); - QIcon thumbViewIcon = createQIconOnOffPNG("viewicon"); + QIcon thumbViewIcon = createQIconOnOff("viewicon"); QAction *thumbView = new QAction(thumbViewIcon, tr("Icons View"), this); thumbView->setCheckable(true); thumbView->setIconText(tr("Icon")); @@ -1846,7 +1842,7 @@ DvItemViewerButtonBar::DvItemViewerButtonBar(DvItemViewer *itemViewer, actions->addAction(thumbView); addAction(thumbView); - QIcon listViewIcon = createQIconOnOffPNG("viewlist"); + QIcon listViewIcon = createQIconOnOff("viewlist"); QAction *listView = new QAction(listViewIcon, tr("List View"), this); listView->setCheckable(true); listView->setIconText(tr("List")); diff --git a/toonz/sources/toonz/keyframemover.cpp b/toonz/sources/toonz/keyframemover.cpp index 4eb135c..114aec4 100644 --- a/toonz/sources/toonz/keyframemover.cpp +++ b/toonz/sources/toonz/keyframemover.cpp @@ -334,7 +334,7 @@ bool KeyframeMoverTool::canMove(const TPoint &pos) { if (pos.x < 0) return false; int col = pos.x; - int startCol = getViewer()->xToColumn(m_startPos.x); + int startCol = getViewer()->xyToPosition(m_startPos).layer(); if (col != startCol) return false; return true; @@ -358,14 +358,15 @@ void KeyframeMoverTool::onCellChange(int row, int col) { //----------------------------------------------------------------------------- void KeyframeMoverTool::onClick(const QMouseEvent *event) { - m_firstKeyframeMovement = true; - m_selecting = false; - TXsheet *xsheet = getViewer()->getXsheet(); - int row = getViewer()->yToRow(event->pos().y()); - int col = getViewer()->xToColumn(event->pos().x()); - m_firstRow = row; - m_firstCol = col; - bool isSelected = getSelection()->isSelected(row, col); + m_firstKeyframeMovement = true; + m_selecting = false; + TXsheet *xsheet = getViewer()->getXsheet(); + CellPosition cellPosition = getViewer()->xyToPosition(event->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); + m_firstRow = row; + m_firstCol = col; + bool isSelected = getSelection()->isSelected(row, col); if (!m_justMovement) { if (event->modifiers() & Qt::ControlModifier) ctrlSelect(row, col); @@ -389,11 +390,12 @@ void KeyframeMoverTool::onClick(const QMouseEvent *event) { //----------------------------------------------------------------------------- void KeyframeMoverTool::onDrag(const QMouseEvent *e) { - int x = e->pos().x(); - int y = e->pos().y(); - m_curPos = TPointD(x, y); - int row = getViewer()->yToRow(y); - int col = getViewer()->xToColumn(x); + int x = e->pos().x(); + int y = e->pos().y(); + m_curPos = TPointD(x, y); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); if (m_selecting) rectSelect(row, col); else { @@ -417,7 +419,7 @@ void KeyframeMoverTool::onDrag(const QMouseEvent *e) { //----------------------------------------------------------------------------- -void KeyframeMoverTool::onRelease(int row, int col) { +void KeyframeMoverTool::onRelease(const CellPosition &pos) { if (m_selecting) { m_selecting = false; getViewer()->updateCells(); diff --git a/toonz/sources/toonz/keyframemover.h b/toonz/sources/toonz/keyframemover.h index 7660eba..69c8869 100644 --- a/toonz/sources/toonz/keyframemover.h +++ b/toonz/sources/toonz/keyframemover.h @@ -92,7 +92,7 @@ public: void onClick(const QMouseEvent *event) override; void onDrag(const QMouseEvent *event) override; - void onRelease(int row, int col) override; + void onRelease(const CellPosition &pos) override; void drawCellsArea(QPainter &p) override; }; diff --git a/toonz/sources/toonz/layerheaderpanel.cpp b/toonz/sources/toonz/layerheaderpanel.cpp new file mode 100644 index 0000000..63cc931 --- /dev/null +++ b/toonz/sources/toonz/layerheaderpanel.cpp @@ -0,0 +1,233 @@ +#include "layerheaderpanel.h" + +#include +#include + +#include "xsheetviewer.h" +#include "xshcolumnviewer.h" + +#include "tapp.h" +#include "toonz/tscenehandle.h" +#include "toonz/txsheethandle.h" +#include "toonz/tobjecthandle.h" + +#include "toonz/preferences.h" + +using XsheetGUI::ColumnArea; + +#if QT_VERSION >= 0x050500 +LayerHeaderPanel::LayerHeaderPanel(XsheetViewer *viewer, QWidget *parent, + Qt::WindowFlags flags) +#else +LayerHeaderPanel::LayerHeaderPanel(XsheetViewer *viewer, QWidget *parent, + Qt::WFlags flags) +#endif + : QWidget(parent, flags), m_viewer(viewer) { + const Orientation *o = Orientations::leftToRight(); + QRect rect = o->rect(PredefinedRect::LAYER_HEADER_PANEL); + + setObjectName("layerHeaderPanel"); + + setFixedSize(rect.size()); + + setMouseTracking(true); +} + +LayerHeaderPanel::~LayerHeaderPanel() {} + +namespace { + +QColor mix(const QColor &a, const QColor &b, double w) { + return QColor(a.red() * w + b.red() * (1 - w), + a.green() * w + b.green() * (1 - w), + a.blue() * w + b.blue() * (1 - w)); +} + +QColor withAlpha(const QColor &color, double alpha) { + QColor result(color); + result.setAlpha(alpha * 255); + return result; +} + +QRect shorter(const QRect original) { return original.adjusted(0, 2, 0, -2); } + +QLine leftSide(const QRect &r) { return QLine(r.topLeft(), r.bottomLeft()); } + +QLine rightSide(const QRect &r) { return QLine(r.topRight(), r.bottomRight()); } +} + +void LayerHeaderPanel::paintEvent(QPaintEvent *event) { + QPainter p(this); + p.setRenderHint(QPainter::SmoothPixmapTransform, true); + + const Orientation *o = Orientations::leftToRight(); + + QColor background = m_viewer->getBGColor(); + QColor slightlyLighter = {mix(background, Qt::white, 0.95)}; + QRect rect = QRect(QPoint(0, 0), size()); + p.fillRect(rect.adjusted(0, 0, -3, 0), slightlyLighter); + + drawIcon(p, PredefinedRect::EYE, XsheetGUI::PreviewVisibleColor, + ColumnArea::Pixmaps::eye()); + drawIcon(p, PredefinedRect::PREVIEW_LAYER, boost::none, + ColumnArea::Pixmaps::cameraStand()); + drawIcon(p, PredefinedRect::LOCK, QColor(255, 255, 255, 128), + ColumnArea::Pixmaps::lock()); + + QRect numberRect = o->rect(PredefinedRect::LAYER_NUMBER); + + int leftadj = 2; + if (Preferences::instance()->isShowColumnNumbersEnabled()) { + p.drawText(numberRect, Qt::AlignCenter | Qt::TextSingleLine, "#"); + + leftadj += 20; + } + + QRect nameRect = + o->rect(PredefinedRect::LAYER_NAME).adjusted(leftadj, 0, -1, 0); + p.drawText(nameRect, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, + QObject::tr("Layer name")); + + drawLines(p, numberRect, nameRect); +} + +void LayerHeaderPanel::drawIcon(QPainter &p, PredefinedRect rect, + optional fill, + const QPixmap &pixmap) const { + QRect iconRect = + Orientations::leftToRight()->rect(rect).adjusted(-2, 0, -2, 0); + + if (rect == PredefinedRect::LOCK) { + p.setPen(Qt::gray); + p.setBrush(QColor(255, 255, 255, 128)); + p.drawRect(iconRect); + iconRect.adjust(1, 1, -1, -1); + } else if (fill) + p.fillRect(iconRect, *fill); + p.drawPixmap(iconRect, pixmap); +} + +void LayerHeaderPanel::drawLines(QPainter &p, const QRect &numberRect, + const QRect &nameRect) const { + p.setPen(withAlpha(m_viewer->getTextColor(), 0.5)); + + QLine line = {leftSide(shorter(numberRect)).translated(-2, 0)}; + p.drawLine(line); + + if (Preferences::instance()->isShowColumnNumbersEnabled()) { + line = rightSide(shorter(numberRect)).translated(-2, 0); + p.drawLine(line); + } + + line = rightSide(shorter(nameRect)); + p.drawLine(line); +} + +void LayerHeaderPanel::showOrHide(const Orientation *o) { + QRect rect = o->rect(PredefinedRect::LAYER_HEADER_PANEL); + if (rect.isEmpty()) + hide(); + else + show(); +} + +//----------------------------------------------------------------------------- + +void LayerHeaderPanel::mousePressEvent(QMouseEvent *event) { + const Orientation *o = Orientations::leftToRight(); + + m_doOnRelease = 0; + + if (event->button() == Qt::LeftButton) { + // get mouse position + QPoint pos = event->pos(); + + // preview button + if (o->rect(PredefinedRect::EYE_AREA).contains(pos)) { + m_doOnRelease = ToggleAllPreviewVisible; + } + // camstand button + else if (o->rect(PredefinedRect::PREVIEW_LAYER_AREA).contains(pos)) { + m_doOnRelease = ToggleAllTransparency; + } + // lock button + else if (o->rect(PredefinedRect::LOCK_AREA).contains(pos)) { + m_doOnRelease = ToggleAllLock; + } + } + + update(); +} + +void LayerHeaderPanel::mouseMoveEvent(QMouseEvent *event) { + const Orientation *o = Orientations::leftToRight(); + + QPoint pos = event->pos(); + + // preview button + if (o->rect(PredefinedRect::EYE_AREA).contains(pos)) { + m_tooltip = tr("Preview Visbility Toggle All"); + } + // camstand button + else if (o->rect(PredefinedRect::PREVIEW_LAYER_AREA).contains(pos)) { + m_tooltip = tr("Camera Stand Visibility Toggle All"); + } + // lock button + else if (o->rect(PredefinedRect::LOCK).contains(pos)) { + m_tooltip = tr("Lock Toggle All"); + } else { + m_tooltip = tr(""); + } + + m_pos = pos; + + update(); +} + +//----------------------------------------------------------------------------- + +bool LayerHeaderPanel::event(QEvent *event) { + if (event->type() == QEvent::ToolTip) { + if (!m_tooltip.isEmpty()) + QToolTip::showText(mapToGlobal(m_pos), m_tooltip); + else + QToolTip::hideText(); + } + return QWidget::event(event); +} + +//----------------------------------------------------------------------------- + +void LayerHeaderPanel::mouseReleaseEvent(QMouseEvent *event) { + TApp *app = TApp::instance(); + TXsheet *xsh = m_viewer->getXsheet(); + int col, totcols = xsh->getColumnCount(); + bool sound_changed = false; + + if (m_doOnRelease != 0 && totcols > 0) { + for (col = 0; col < totcols; col++) { + if (!xsh->isColumnEmpty(col)) { + TXshColumn *column = xsh->getColumn(col); + + if (m_doOnRelease == ToggleAllPreviewVisible) { + column->setPreviewVisible(!column->isPreviewVisible()); + } else if (m_doOnRelease == ToggleAllTransparency) { + column->setCamstandVisible(!column->isCamstandVisible()); + if (column->getSoundColumn()) sound_changed = true; + } else if (m_doOnRelease == ToggleAllLock) { + column->lock(!column->isLocked()); + } + } + } + + if (sound_changed) { + app->getCurrentXsheet()->notifyXsheetSoundChanged(); + } + + app->getCurrentScene()->notifySceneChanged(); + app->getCurrentXsheet()->notifyXsheetChanged(); + } + m_viewer->updateColumnArea(); + update(); + m_doOnRelease = 0; +} diff --git a/toonz/sources/toonz/layerheaderpanel.h b/toonz/sources/toonz/layerheaderpanel.h new file mode 100644 index 0000000..7a71610 --- /dev/null +++ b/toonz/sources/toonz/layerheaderpanel.h @@ -0,0 +1,55 @@ +#pragma once + +#ifndef LAYER_HEADER_PANEL_INCLUDED +#define LAYER_HEADER_PANEL_INCLUDED + +#include +#include + +#include "orientation.h" + +using boost::optional; + +class XsheetViewer; + +// Panel showing column headers for layers in timeline mode +class LayerHeaderPanel final : public QWidget { + Q_OBJECT + + enum { ToggleAllTransparency = 1, ToggleAllPreviewVisible, ToggleAllLock }; + + int m_doOnRelease; + QString m_tooltip; + QPoint m_pos; + +private: + XsheetViewer *m_viewer; + +public: +#if QT_VERSION >= 0x050500 + LayerHeaderPanel(XsheetViewer *viewer, QWidget *parent = 0, + Qt::WindowFlags flags = 0); +#else + LayerHeaderPanel(XsheetViewer *viewer, QWidget *parent = 0, + Qt::WFlags flags = 0); +#endif + ~LayerHeaderPanel(); + + void showOrHide(const Orientation *o); + +protected: + void paintEvent(QPaintEvent *event) override; + + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + bool event(QEvent *event) override; + +private: + void drawIcon(QPainter &p, PredefinedRect rect, optional fill, + const QPixmap &pixmap) const; + void drawLines(QPainter &p, const QRect &numberRect, + const QRect &nameRect) const; +}; + +#endif diff --git a/toonz/sources/toonz/levelcreatepopup.cpp b/toonz/sources/toonz/levelcreatepopup.cpp index 70d8dd1..ccfee44 100644 --- a/toonz/sources/toonz/levelcreatepopup.cpp +++ b/toonz/sources/toonz/levelcreatepopup.cpp @@ -343,8 +343,8 @@ bool LevelCreatePopup::levelExists(std::wstring levelName) { //----------------------------------------------------------------------------- void LevelCreatePopup::showEvent(QShowEvent *) { - nextName(); update(); + nextName(); m_nameFld->setFocus(); if (Preferences::instance()->getUnits() == "pixel") { m_dpiFld->hide(); @@ -480,6 +480,7 @@ bool LevelCreatePopup::apply() { error( tr("The level name specified is already used: please choose a " "different level name")); + m_nameFld->selectAll(); return false; } @@ -492,6 +493,7 @@ bool LevelCreatePopup::apply() { error( tr("The level name specified is already used: please choose a " "different level name")); + m_nameFld->selectAll(); return false; } parentDir = scene->decodeFilePath(parentDir); @@ -617,7 +619,7 @@ void LevelCreatePopup::update() { break; } if (index >= 0) m_levelTypeOm->setCurrentIndex(index); - + /* (old behaviour) TCamera* camera = scene->getCurrentCamera(); diff --git a/toonz/sources/toonz/main.cpp b/toonz/sources/toonz/main.cpp index 347408c..e8a0288 100644 --- a/toonz/sources/toonz/main.cpp +++ b/toonz/sources/toonz/main.cpp @@ -367,7 +367,9 @@ int main(int argc, char *argv[]) { #endif // splash screen - QPixmap splashPixmap(":Resources/splash.png"); + QPixmap splashPixmap = QIcon(":Resources/splash.svg").pixmap(QSize(610, 344)); + splashPixmap.setDevicePixelRatio(QApplication::desktop()->devicePixelRatio()); +// QPixmap splashPixmap(":Resources/splash.png"); #ifdef _WIN32 QFont font("Arial", -1); #else diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index c93ebc8..37b086c 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -89,7 +89,8 @@ TEnv::IntVar NoShiftToggleAction("NoShiftToggleAction", 0); namespace { //============================================================================= -const std::string layoutsFileName = "layouts.txt"; +// layout file name may be overwritten by the argument +std::string layoutsFileName = "layouts.txt"; const std::string currentRoomFileName = "currentRoom.txt"; bool scrambledRooms = false; @@ -108,8 +109,10 @@ bool readRoomList(std::vector &roomPaths, " not found!"); fp = ToonzFolder::getRoomsFile(layoutsFileName); if (!TFileStatus(fp).doesExist()) return false; - } else + } else { argumentLayoutFileLoaded = true; + layoutsFileName = argumentLayoutFileName.toStdString(); + } } else { fp = ToonzFolder::getRoomsFile(layoutsFileName); if (!TFileStatus(fp).doesExist()) return false; @@ -255,6 +258,9 @@ void Room::save() { TPanel *pane = static_cast(layout->itemAt(i)->widget()); settings.setValue("name", pane->objectName()); settings.setValue("geometry", geometries[i]); // Use passed geometry + if (SaveLoadQSettings *persistent = + dynamic_cast(pane->widget())) + persistent->save(settings); if (pane->getViewType() != -1) // If panel has different viewtypes, store current one settings.setValue("viewtype", pane->getViewType()); @@ -303,6 +309,9 @@ void Room::load(const TFilePath &fp) { // Allocate panel paneObjectName = name.toString(); pane = TPanelFactory::createPanel(this, paneObjectName); + if (SaveLoadQSettings *persistent = + dynamic_cast(pane->widget())) + persistent->load(settings); } if (!pane) { @@ -1050,8 +1059,10 @@ void MainWindow::onUpgradeTabPro() {} //----------------------------------------------------------------------------- void MainWindow::onAbout() { - QLabel *label = new QLabel(); - label->setPixmap(QPixmap(":Resources/splash.png")); + QLabel *label = new QLabel(); + QPixmap pixmap = QIcon(":Resources/splash.svg").pixmap(QSize(610, 344)); + pixmap.setDevicePixelRatio(QApplication::desktop()->devicePixelRatio()); + label->setPixmap(pixmap); DVGui::Dialog *dialog = new DVGui::Dialog(this, true); dialog->setWindowTitle(tr("About OpenToonz")); @@ -1757,7 +1768,10 @@ void MainWindow::defineActions() { createMenuXsheetAction(MI_DeleteInk, tr("&Delete Lines..."), ""); createMenuXsheetAction(MI_MergeColumns, tr("&Merge Levels"), ""); createMenuXsheetAction(MI_InsertFx, tr("&New FX..."), "Ctrl+F"); - createMenuXsheetAction(MI_NewOutputFx, tr("&New Output"), "Ctrl+F"); + QAction *newOutputAction = + createMenuXsheetAction(MI_NewOutputFx, tr("&New Output"), "Ctrl+F"); + newOutputAction->setIcon(createQIconOnOff("output", false)); + createRightClickMenuAction(MI_FxParamEditor, tr("&Edit FX..."), "Ctrl+K"); createMenuXsheetAction(MI_InsertSceneFrame, tr("Insert Frame"), ""); @@ -2086,7 +2100,7 @@ void MainWindow::defineActions() { QAction *refreshAct = createMiscAction(MI_RefreshTree, tr("Refresh Folder Tree"), ""); refreshAct->setIconText(tr("Refresh")); - refreshAct->setIcon(createQIconOnOffPNG("refresh")); + refreshAct->setIcon(createQIcon("refresh")); createToolOptionsAction("A_ToolOption_GlobalKey", tr("Global Key"), ""); diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index a12379f..ad64942 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -478,6 +478,12 @@ void PreferencesPopup::onAutoExposeChanged(int index) { //----------------------------------------------------------------------------- +void PreferencesPopup::onIgnoreImageDpiChanged(int index) { + m_pref->setIgnoreImageDpi(index == Qt::Checked); +} + +//----------------------------------------------------------------------------- + void PreferencesPopup::onSubsceneFolderChanged(int index) { m_pref->enableSubsceneFolder(index == Qt::Checked); } @@ -671,7 +677,7 @@ void PreferencesPopup::setChessboardColor2(const TPixel32 &color, //----------------------------------------------------------------------------- void PreferencesPopup::onColumnIconChange(const QString &value) { - m_pref->setColumnIconLoadingPolicy(value == QString("At Once") + m_pref->setColumnIconLoadingPolicy(value == tr("At Once") ? Preferences::LoadAtOnce : Preferences::LoadOnDemand); } @@ -1002,6 +1008,10 @@ void PreferencesPopup::onExpandFunctionHeaderClicked(bool checked) { m_pref->enableExpandFunctionHeader(checked); } +void PreferencesPopup::onShowColumnNumbersChanged(int index) { + m_pref->enableShowColumnNumbers(index == Qt::Checked); +} + //----------------------------------------------------------------------------- void PreferencesPopup::onUseArrowKeyToShiftCellSelectionClicked(int on) { @@ -1159,6 +1169,8 @@ PreferencesPopup::PreferencesPopup() new CheckBox(tr("Expose Loaded Levels in Xsheet"), this); CheckBox *createSubfolderCB = new CheckBox(tr("Create Sub-folder when Importing Sub-xsheet"), this); + CheckBox *m_ignoreImageDpiCB = + new CheckBox(tr("Use Camera DPI for All Imported Images"), this); // Column Icon m_columnIconOm = new QComboBox(this); QComboBox *initialLoadTlvCachingBehaviorComboBox = new QComboBox(this); @@ -1224,6 +1236,8 @@ PreferencesPopup::PreferencesPopup() tr("Expand Function Editor Header to Match XSheet Toolbar Height " "(Requires Restart)"), this); + CheckBox *showColumnNumbersCB = + new CheckBox(tr("Show Column Numbers in Column Headers"), this); //--- Animation ------------------------------ categoryList->addItem(tr("Animation")); @@ -1383,6 +1397,7 @@ PreferencesPopup::PreferencesPopup() //--- Loading ------------------------------ exposeLoadedLevelsCB->setChecked(m_pref->isAutoExposeEnabled()); + m_ignoreImageDpiCB->setChecked(m_pref->isIgnoreImageDpiEnabled()); QStringList behaviors; behaviors << tr("On Demand") << tr("All Icons") << tr("All Icons & Images"); initialLoadTlvCachingBehaviorComboBox->addItems(behaviors); @@ -1492,6 +1507,7 @@ PreferencesPopup::PreferencesPopup() m_pref->isInputCellsWithoutDoubleClickingEnabled()); m_showXSheetToolbar->setChecked(m_pref->isShowXSheetToolbarEnabled()); m_expandFunctionHeader->setChecked(m_pref->isExpandFunctionHeaderEnabled()); + showColumnNumbersCB->setChecked(m_pref->isShowColumnNumbersEnabled()); //--- Animation ------------------------------ QStringList list; @@ -1772,6 +1788,8 @@ PreferencesPopup::PreferencesPopup() Qt::AlignLeft | Qt::AlignVCenter); loadingFrameLay->addWidget(removeSceneNumberFromLoadedLevelNameCB, 0, Qt::AlignLeft | Qt::AlignVCenter); + loadingFrameLay->addWidget(m_ignoreImageDpiCB, 0, + Qt::AlignLeft | Qt::AlignVCenter); QGridLayout *cacheLay = new QGridLayout(); cacheLay->setMargin(0); @@ -1929,7 +1947,7 @@ PreferencesPopup::PreferencesPopup() QGridLayout *xsheetFrameLay = new QGridLayout(); xsheetFrameLay->setMargin(15); xsheetFrameLay->setHorizontalSpacing(15); - xsheetFrameLay->setVerticalSpacing(10); + xsheetFrameLay->setVerticalSpacing(11); { xsheetFrameLay->addWidget(new QLabel(tr("Next/Previous Step Frames:")), 0, 0, Qt::AlignRight | Qt::AlignVCenter); @@ -1955,6 +1973,7 @@ PreferencesPopup::PreferencesPopup() m_showXSheetToolbar->setLayout(xSheetToolbarLay); xsheetFrameLay->addWidget(m_showXSheetToolbar, 7, 0, 3, 3); + xsheetFrameLay->addWidget(showColumnNumbersCB, 10, 0, 1, 2); } xsheetFrameLay->setColumnStretch(0, 0); xsheetFrameLay->setColumnStretch(1, 0); @@ -2226,6 +2245,8 @@ PreferencesPopup::PreferencesPopup() //--- Loading ---------------------- ret = ret && connect(exposeLoadedLevelsCB, SIGNAL(stateChanged(int)), this, SLOT(onAutoExposeChanged(int))); + ret = ret && connect(m_ignoreImageDpiCB, SIGNAL(stateChanged(int)), this, + SLOT(onIgnoreImageDpiChanged(int))); ret = ret && connect(initialLoadTlvCachingBehaviorComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onInitialLoadTlvCachingBehaviorChanged(int))); @@ -2305,6 +2326,9 @@ PreferencesPopup::PreferencesPopup() ret = ret && connect(m_expandFunctionHeader, SIGNAL(clicked(bool)), SLOT(onExpandFunctionHeaderClicked(bool))); + ret = ret && connect(showColumnNumbersCB, SIGNAL(stateChanged(int)), this, + SLOT(onShowColumnNumbersChanged(int))); + //--- Animation ---------------------- ret = ret && connect(m_keyframeType, SIGNAL(currentIndexChanged(int)), SLOT(onKeyframeTypeChanged(int))); diff --git a/toonz/sources/toonz/preferencespopup.h b/toonz/sources/toonz/preferencespopup.h index fe99d17..ab25ffa 100644 --- a/toonz/sources/toonz/preferencespopup.h +++ b/toonz/sources/toonz/preferencespopup.h @@ -72,7 +72,8 @@ private: *m_onionSkinVisibility, *m_pixelsOnlyCB, *m_projectRootDocuments, *m_projectRootDesktop, *m_projectRootCustom, *m_projectRootStuff, *m_onionSkinDuringPlayback, *m_autoSaveSceneCB, *m_autoSaveOtherFilesCB, - *m_useNumpadForSwitchingStyles, *m_expandFunctionHeader; + *m_useNumpadForSwitchingStyles, *m_expandFunctionHeader, + *m_ignoreImageDpiCB; DVGui::FileField *m_customProjectRootFileField; @@ -140,6 +141,7 @@ private slots: void onRemoveLevelFormat(); void onEditLevelFormat(); void onLevelFormatEdited(); + void onIgnoreImageDpiChanged(int index); void onShow0ThickLinesChanged(int); void onRegionAntialiasChanged(int); void onImportPolicyChanged(int); @@ -174,6 +176,7 @@ private slots: void onUseNumpadForSwitchingStylesClicked(bool); void onShowXSheetToolbarClicked(bool); void onExpandFunctionHeaderClicked(bool); + void onShowColumnNumbersChanged(int); void onUseArrowKeyToShiftCellSelectionClicked(int); void onInputCellsWithoutDoubleClickingClicked(int); void onWatchFileSystemClicked(int); diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index 23b160b..c34b29c 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -472,6 +472,10 @@ SceneViewer::SceneViewer(ImageUtils::FullScreenWidget *parent) , m_mouseButton(Qt::NoButton) , m_foregroundDrawing(false) , m_tabletEvent(false) + , m_tabletActive(false) + , m_tabletMove(false) + , m_tabletPressed(false) + , m_tabletReleased(false) , m_buttonClicked(false) , m_referenceMode(NORMAL_REFERENCE) , m_previewMode(NO_PREVIEW) @@ -504,7 +508,8 @@ SceneViewer::SceneViewer(ImageUtils::FullScreenWidget *parent) , m_toolDisableReason("") , m_editPreviewSubCamera(false) , m_locator(NULL) - , m_isLocator(false) { + , m_isLocator(false) + , m_isBusyOnTabletMove(false) { m_visualSettings.m_sceneProperties = TApp::instance()->getCurrentScene()->getScene()->getProperties(); // Enables multiple key input. @@ -514,6 +519,8 @@ SceneViewer::SceneViewer(ImageUtils::FullScreenWidget *parent) setFocusPolicy(Qt::StrongFocus); setAcceptDrops(true); this->setMouseTracking(true); + // to be introduced from Qt 5.9 + // this->setTabletTracking(true); for (int i = 0; i < tArrayCount(m_viewAff); i++) setViewMatrix(getNormalZoomScale(), i); @@ -835,6 +842,8 @@ void SceneViewer::showEvent(QShowEvent *) { connect(app->getCurrentTool(), SIGNAL(toolCursorTypeChanged()), this, SLOT(onToolChanged())); + connect(app, SIGNAL(tabletLeft()), this, SLOT(resetTabletStatus())); + if (m_hRuler && m_vRuler) { if (!viewRulerToggle.getStatus()) { m_hRuler->hide(); @@ -885,6 +894,7 @@ void SceneViewer::hideEvent(QHideEvent *) { ToolHandle *toolHandle = app->getCurrentTool(); if (toolHandle) toolHandle->disconnect(this); + disconnect(app, SIGNAL(tabletLeft()), this, SLOT(resetTabletStatus())); // hide locator if (m_locator && m_locator->isVisible()) m_locator->hide(); } diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h index 8e2c3b3..111e459 100644 --- a/toonz/sources/toonz/sceneviewer.h +++ b/toonz/sources/toonz/sceneviewer.h @@ -66,7 +66,8 @@ class SceneViewer final : public GLWidgetForHighDpi, Qt::MouseButton m_mouseButton; bool m_foregroundDrawing; - bool m_tabletEvent; + bool m_tabletEvent, m_tabletPressed, m_tabletReleased, m_tabletMove, + m_tabletActive; // used to handle wrong mouse drag events! bool m_buttonClicked, m_toolSwitched; bool m_shownOnce = false; @@ -138,6 +139,8 @@ class SceneViewer final : public GLWidgetForHighDpi, bool m_isLocator; bool m_isStyleShortcutSwitchable; + bool m_isBusyOnTabletMove; + // iwsw commented out temporarily // Ghibli3DLutUtil * m_ghibli3DLutUtil; public: @@ -283,6 +286,11 @@ protected: void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; + + void onPress(const TMouseEvent &event); + void onMove(const TMouseEvent &event); + void onRelease(const TMouseEvent &event); + void wheelEvent(QWheelEvent *) override; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; @@ -366,6 +374,10 @@ public slots: // delete preview-subcamera executed from context menu void doDeleteSubCamera(); + void resetTabletStatus(); + + void releaseBusyOnTabletMove() { m_isBusyOnTabletMove = false; } + signals: void onZoomChanged(); diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 413d5a6..a605d42 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -74,29 +74,52 @@ int modifiers = 0; //----------------------------------------------------------------------------- void initToonzEvent(TMouseEvent &toonzEvent, QMouseEvent *event, - int widgetHeight, double pressure, bool isTablet, - bool isClick, int devPixRatio) { + int widgetHeight, double pressure, int devPixRatio) { toonzEvent.m_pos = TPoint(event->pos().x() * devPixRatio, widgetHeight - 1 - event->pos().y() * devPixRatio); - toonzEvent.m_pressure = isTablet ? int(255 * pressure) : 255; + toonzEvent.m_mousePos = event->pos(); + toonzEvent.m_pressure = 255; toonzEvent.setModifiers(event->modifiers() & Qt::ShiftModifier, event->modifiers() & Qt::AltModifier, event->modifiers() & Qt::ControlModifier); - toonzEvent.m_leftButtonPressed = (event->buttons() & Qt::LeftButton) != 0; + toonzEvent.m_buttons = event->buttons(); + toonzEvent.m_button = event->button(); + toonzEvent.m_isTablet = false; +} + +//----------------------------------------------------------------------------- + +void initToonzEvent(TMouseEvent &toonzEvent, QTabletEvent *event, + int widgetHeight, double pressure, int devPixRatio) { + toonzEvent.m_pos = TPoint(event->pos().x() * devPixRatio, + widgetHeight - 1 - event->pos().y() * devPixRatio); + toonzEvent.m_mousePos = event->pos(); + toonzEvent.m_pressure = int(255 * pressure); + + toonzEvent.setModifiers(event->modifiers() & Qt::ShiftModifier, + event->modifiers() & Qt::AltModifier, + event->modifiers() & Qt::ControlModifier); + + toonzEvent.m_buttons = event->buttons(); + toonzEvent.m_button = event->button(); + toonzEvent.m_isTablet = true; } //----------------------------------------------------------------------------- void initToonzEvent(TMouseEvent &toonzEvent, QKeyEvent *event) { toonzEvent.m_pos = TPoint(); + toonzEvent.m_mousePos = QPoint(); toonzEvent.m_pressure = 0; toonzEvent.setModifiers(event->modifiers() & Qt::ShiftModifier, event->modifiers() & Qt::AltModifier, event->modifiers() & Qt::ControlModifier); - toonzEvent.m_leftButtonPressed = false; + toonzEvent.m_buttons = Qt::NoButton; + toonzEvent.m_button = Qt::NoButton; + toonzEvent.m_isTablet = false; } //----------------------------------------------------------------------------- @@ -201,9 +224,11 @@ void SceneViewer::onButtonPressed(FlipConsole::EGadget button) { void SceneViewer::tabletEvent(QTabletEvent *e) { if (m_freezedStatus != NO_FREEZED) return; - m_tabletEvent = true; - m_pressure = e->pressure(); - + m_tabletEvent = true; + m_pressure = e->pressure(); + m_tabletPressed = false; + m_tabletReleased = false; + m_tabletMove = false; // Management of the Eraser pointer ToolHandle *toolHandle = TApp::instance()->getCurrentTool(); if (e->pointerType() == QTabletEvent::Eraser) { @@ -223,7 +248,58 @@ void SceneViewer::tabletEvent(QTabletEvent *e) { m_eraserPointerOn = false; } } - e->ignore(); + switch (e->type()) { + case QEvent::TabletPress: { + // In OSX tablet action may cause only tabletEvent, not followed by + // mousePressEvent. + // So call onPress here in order to enable processing. + // This separation done is only for the left Button (regular pen touch), + // because + // the current Qt seems to fail to catch the Wacom's button binding properly + // with QTabletEvent->button() when pressing middle or right button. + // So, in such case set m_tabletEvent = FALSE and let the mousePressEvent to + // work. + if (e->button() == Qt::LeftButton) { + TMouseEvent mouseEvent; + initToonzEvent(mouseEvent, e, height(), e->pressure(), getDevPixRatio()); + m_tabletPressed = true; + onPress(mouseEvent); + } else + m_tabletEvent = false; + } break; + case QEvent::TabletRelease: { + if (m_tabletActive) { + m_tabletReleased = true; + TMouseEvent mouseEvent; + initToonzEvent(mouseEvent, e, height(), e->pressure(), getDevPixRatio()); + onRelease(mouseEvent); + } else + m_tabletEvent = false; + } break; + // for now "TabletMove" will be called only when with some button. + // setTabletTracking(bool) will be introduced in Qt5.9 + case QEvent::TabletMove: { + if (m_tabletActive) { + QPoint curPos = e->pos() * getDevPixRatio(); + // It seems that the tabletEvent is called more often than mouseMoveEvent. + // So I fire the interval timer in order to limit the following process + // to be called in 50fps in maximum. + if (curPos != m_lastMousePos && !m_isBusyOnTabletMove) { + m_isBusyOnTabletMove = true; + TMouseEvent mouseEvent; + initToonzEvent(mouseEvent, e, height(), e->pressure(), + getDevPixRatio()); + m_tabletMove = true; + QTimer::singleShot(20, this, SLOT(releaseBusyOnTabletMove())); + onMove(mouseEvent); + } + } else + m_tabletEvent = false; + } break; + default: + break; + } + e->accept(); } //----------------------------------------------------------------------------- @@ -272,9 +348,30 @@ void SceneViewer::enterEvent(QEvent *) { //----------------------------------------------------------------------------- void SceneViewer::mouseMoveEvent(QMouseEvent *event) { + // if this is called just after tabletEvent, skip the execution + if (m_tabletEvent) return; + + // there are three cases to come here : + // 1. on mouse is moved (no tablet is used) + // 2. on tablet is moved, with middle or right button is pressed + // 3. on tablet is moved, BUT tabletEvent was not called + // 4. on tablet is moved without pen touching (i.e. floating move) + // the case 3 sometimes occurs on OSX. (reporteed in QTBUG-26532 for Qt4, but + // not confirmed in Qt5) + // the case 4 can be removed once start using Qt5.9 and call + // setTabletTracking(true). + + TMouseEvent mouseEvent; + initToonzEvent(mouseEvent, event, height(), 1.0, getDevPixRatio()); + onMove(mouseEvent); +} + +//----------------------------------------------------------------------------- + +void SceneViewer::onMove(const TMouseEvent &event) { if (m_freezedStatus != NO_FREEZED) return; - QPoint curPos = event->pos() * getDevPixRatio(); + QPoint curPos = event.mousePos() * getDevPixRatio(); bool cursorSet = false; m_lastMousePos = curPos; @@ -340,9 +437,7 @@ void SceneViewer::mouseMoveEvent(QMouseEvent *event) { } // if the middle mouse button is pressed while dragging, then do panning - Qt::MouseButtons mousebuttons; - mousebuttons = event->buttons(); - if (mousebuttons & Qt::MidButton) { + if (event.buttons() & Qt::MidButton) { // panning QPoint p = curPos - m_pos; if (m_pos == QPoint(0, 0) && p.manhattanLength() > 300) return; @@ -357,9 +452,6 @@ void SceneViewer::mouseMoveEvent(QMouseEvent *event) { return; } tool->setViewer(this); - TMouseEvent toonzEvent; - initToonzEvent(toonzEvent, event, height(), m_pressure, m_tabletEvent, - false, getDevPixRatio()); TPointD worldPos = winToWorld(curPos); TPointD pos = tool->getMatrix().inv() * worldPos; @@ -376,31 +468,37 @@ void SceneViewer::mouseMoveEvent(QMouseEvent *event) { // qDebug() << "mouseMoveEvent. " << (m_tabletEvent?"tablet":"mouse") // << " pressure=" << m_pressure << " mouseButton=" << m_mouseButton // << " buttonClicked=" << m_buttonClicked; - if ((m_tabletEvent && m_pressure > 0) || m_mouseButton == Qt::LeftButton) { + + // separate tablet events from mouse events + // don't perform a drag event if tablet not active + if (m_tabletActive && !m_tabletMove) return; + if (m_tabletEvent && m_tabletActive && m_tabletMove) { + tool->leftButtonDrag(pos, event); + } + + else if (m_mouseButton == Qt::LeftButton) { // sometimes the mousePressedEvent is postponed to a wrong mouse move // event! - if (m_buttonClicked && !m_toolSwitched) - tool->leftButtonDrag(pos, toonzEvent); + if (m_buttonClicked && !m_toolSwitched) tool->leftButtonDrag(pos, event); } else if (m_pressure == 0) { - tool->mouseMove(pos, toonzEvent); - // m_tabletEvent=false; + tool->mouseMove(pos, event); } if (!cursorSet) setToolCursor(this, tool->getCursorId()); - m_pos = curPos; + m_pos = curPos; + m_tabletMove = false; } else if (m_mouseButton == Qt::MidButton) { - if ((event->buttons() & Qt::MidButton) == 0) - m_mouseButton = Qt::NoButton; - else - // scrub with shift and middle click - if (event->modifiers() & Qt::ShiftModifier) { + if ((event.buttons() & Qt::MidButton) == 0) m_mouseButton = Qt::NoButton; + // scrub with shift and middle click + else if (event.isShiftPressed()) { if (curPos.x() > m_pos.x()) { CommandManager::instance()->execute("MI_NextFrame"); } else if (curPos.x() < m_pos.x()) { CommandManager::instance()->execute("MI_PrevFrame"); } - } else + } else { // panning panQt(curPos - m_pos); + } m_pos = curPos; return; @@ -410,6 +508,24 @@ void SceneViewer::mouseMoveEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- void SceneViewer::mousePressEvent(QMouseEvent *event) { + // if this is called just after tabletEvent, skip the execution + if (m_tabletEvent) return; + + // For now OSX has a critical problem that mousePressEvent is called just + // after releasing the stylus, which causes the irregular stroke while + // float-moving. + // In such case resetTabletStatus() will be called on + // QEvent::TabletLeaveProximity + // and will cancel the onPress operation called here. + + TMouseEvent mouseEvent; + initToonzEvent(mouseEvent, event, height(), 1.0, getDevPixRatio()); + onPress(mouseEvent); +} + +//----------------------------------------------------------------------------- + +void SceneViewer::onPress(const TMouseEvent &event) { // evita i press ripetuti if (m_buttonClicked) return; m_buttonClicked = true; @@ -418,16 +534,15 @@ void SceneViewer::mousePressEvent(QMouseEvent *event) { if (m_mouseButton != Qt::NoButton) return; - m_pos = event->pos() * getDevPixRatio(); - m_mouseButton = event->button(); + m_pos = event.mousePos() * getDevPixRatio(); + m_mouseButton = event.button(); // when using tablet, avoid unexpected drawing behavior occurs when // middle-click - Qt::MouseButtons mousebuttons; - mousebuttons = event->buttons(); if (m_tabletEvent && m_mouseButton == Qt::MidButton && - (mousebuttons | Qt::LeftButton)) + event.isLeftButtonPressed()) { return; + } if (is3DView() && m_current3DDevice != NONE && m_mouseButton == Qt::LeftButton) @@ -473,12 +588,6 @@ void SceneViewer::mousePressEvent(QMouseEvent *event) { tool->setViewer(this); } - TMouseEvent toonzEvent; - if (m_pressure > 0 && !m_tabletEvent) m_tabletEvent = true; - - if (TApp::instance()->isPenCloseToTablet()) m_tabletEvent = true; - initToonzEvent(toonzEvent, event, height(), m_pressure, m_tabletEvent, true, - getDevPixRatio()); // if(!m_tabletEvent) qDebug() << "-----------------MOUSE PRESS 'PURO'. // POSSIBILE EMBOLO"; TPointD pos = tool->getMatrix().inv() * winToWorld(m_pos); @@ -488,16 +597,34 @@ void SceneViewer::mousePressEvent(QMouseEvent *event) { pos.x /= m_dpiScale.x; pos.y /= m_dpiScale.y; } - if (m_mouseButton == Qt::LeftButton) { + // separate tablet and mouse events + if (m_tabletEvent && m_tabletPressed) { + m_tabletActive = true; + tool->leftButtonDown(pos, event); + } else if (m_mouseButton == Qt::LeftButton) { TApp::instance()->getCurrentTool()->setToolBusy(true); - tool->leftButtonDown(pos, toonzEvent); + tool->leftButtonDown(pos, event); } - if (m_mouseButton == Qt::RightButton) tool->rightButtonDown(pos, toonzEvent); + if (m_mouseButton == Qt::RightButton) tool->rightButtonDown(pos, event); + m_tabletPressed = false; } //----------------------------------------------------------------------------- void SceneViewer::mouseReleaseEvent(QMouseEvent *event) { + // if this is called just after tabletEvent, skip the execution + if (m_tabletEvent) { + m_tabletEvent = false; + return; + } + + TMouseEvent mouseEvent; + initToonzEvent(mouseEvent, event, height(), 1.0, getDevPixRatio()); + onRelease(mouseEvent); +} +//----------------------------------------------------------------------------- + +void SceneViewer::onRelease(const TMouseEvent &event) { // evita i release ripetuti if (!m_buttonClicked) return; m_buttonClicked = false; @@ -511,8 +638,10 @@ void SceneViewer::mouseReleaseEvent(QMouseEvent *event) { if (m_freezedStatus != NO_FREEZED) return; - if (m_mouseButton != event->button()) return; + if (m_mouseButton != event.button()) return; + // reject if tablet was active and the up button is not actually the pen. + if (m_tabletActive && !m_tabletReleased) return; if (m_current3DDevice != NONE) { m_mouseButton = Qt::NoButton; m_tabletEvent = false; @@ -527,7 +656,7 @@ void SceneViewer::mouseReleaseEvent(QMouseEvent *event) { } if (m_mouseButton == Qt::LeftButton && m_editPreviewSubCamera) { - if (!PreviewSubCameraManager::instance()->mouseReleaseEvent(this, event)) + if (!PreviewSubCameraManager::instance()->mouseReleaseEvent(this)) goto quit; } @@ -542,11 +671,8 @@ void SceneViewer::mouseReleaseEvent(QMouseEvent *event) { tool->setViewer(this); { - TMouseEvent toonzEvent; - initToonzEvent(toonzEvent, event, height(), m_pressure, m_tabletEvent, - false, getDevPixRatio()); - TPointD pos = - tool->getMatrix().inv() * winToWorld(event->pos() * getDevPixRatio()); + TPointD pos = tool->getMatrix().inv() * + winToWorld(event.mousePos() * getDevPixRatio()); TObjectHandle *objHandle = TApp::instance()->getCurrentObject(); if (tool->getToolType() & TTool::LevelTool && !objHandle->isSpline()) { @@ -554,17 +680,43 @@ void SceneViewer::mouseReleaseEvent(QMouseEvent *event) { pos.y /= m_dpiScale.y; } - if (m_mouseButton == Qt::LeftButton) { - if (!m_toolSwitched) tool->leftButtonUp(pos, toonzEvent); + if (m_mouseButton == Qt::LeftButton || m_tabletReleased) { + if (!m_toolSwitched) tool->leftButtonUp(pos, event); TApp::instance()->getCurrentTool()->setToolBusy(false); } } quit: + m_mouseButton = Qt::NoButton; + m_tabletPressed = false; + m_tabletActive = false; + m_tabletReleased = false; + m_tabletMove = false; + m_pressure = 0; + // Leave m_tabletEvent as-is in order to check whether the onRelease is called + // from tabletEvent or not in mouseReleaseEvent. +} - m_mouseButton = Qt::NoButton; - m_tabletEvent = false; - m_pressure = 0; +//----------------------------------------------------------------------------- +// on OSX, there is a critical bug that SceneViewer::mousePressEvent is called +// when leaving the stylus and it causes unwanted stroke drawn while +// hover-moving of the pen. +// When QEvent::TabletLeaveProximity is detected, call this function +// in order to force initializing such irregular mouse press. +// NOTE: For now QEvent::TabletLeaveProximity is NOT detected on Windows. See +// QTBUG-53628. +void SceneViewer::resetTabletStatus() { + if (!m_buttonClicked) return; + m_mouseButton = Qt::NoButton; + m_tabletEvent = false; + m_tabletPressed = false; + m_tabletActive = false; + m_tabletReleased = false; + m_tabletMove = false; + m_pressure = 0; + m_buttonClicked = false; + if (TApp::instance()->getCurrentTool()->isToolBusy()) + TApp::instance()->getCurrentTool()->setToolBusy(false); } //----------------------------------------------------------------------------- @@ -667,42 +819,42 @@ bool SceneViewer::event(QEvent *e) { } /* -switch(e->type()) -{ -case QEvent::Enter: -qDebug() << "************************** Enter"; -break; -case QEvent::Leave: -qDebug() << "************************** Leave"; -break; - -case QEvent::TabletPress: -qDebug() << "************************** TabletPress" << m_pressure; -break; -case QEvent::TabletMove: -qDebug() << "************************** TabletMove"; -break; -case QEvent::TabletRelease: -qDebug() << "************************** TabletRelease"; -break; - - -case QEvent::MouseButtonPress: -qDebug() << "**************************MouseButtonPress" << m_pressure << " " -<< m_tabletEvent; -break; -case QEvent::MouseMove: -qDebug() << "**************************MouseMove" << m_pressure; -break; -case QEvent::MouseButtonRelease: -qDebug() << "**************************MouseButtonRelease"; -break; - -case QEvent::MouseButtonDblClick: -qDebug() << "============================== MouseButtonDblClick"; -break; -} -*/ + switch(e->type()) + { + case QEvent::Enter: + qDebug() << "************************** Enter"; + break; + case QEvent::Leave: + qDebug() << "************************** Leave"; + break; + + case QEvent::TabletPress: + qDebug() << "************************** TabletPress" << m_pressure; + break; + case QEvent::TabletMove: + qDebug() << "************************** TabletMove"; + break; + case QEvent::TabletRelease: + qDebug() << "************************** TabletRelease"; + break; + + + case QEvent::MouseButtonPress: + qDebug() << "**************************MouseButtonPress" << m_pressure << " " + << m_tabletEvent; + break; + case QEvent::MouseMove: + qDebug() << "**************************MouseMove" << m_pressure; + break; + case QEvent::MouseButtonRelease: + qDebug() << "**************************MouseButtonRelease"; + break; + + case QEvent::MouseButtonDblClick: + qDebug() << "============================== MouseButtonDblClick"; + break; + } + */ return QOpenGLWidget::event(e); } @@ -860,7 +1012,7 @@ void SceneViewer::keyPressEvent(QKeyEvent *event) { flags = TwConsts::TK_CapsLock; else if (key == Qt::Key_Backspace) key = TwConsts::TK_Backspace; - else if (key == Qt::Key_Return) + else if (key == Qt::Key_Return || key == Qt::Key_Enter) key = TwConsts::TK_Return; else if (key == Qt::Key_Left && !shiftButton) key = TwConsts::TK_LeftArrow; @@ -935,9 +1087,9 @@ void SceneViewer::keyPressEvent(QKeyEvent *event) { if (!ret) { TFrameHandle *fh = TApp::instance()->getCurrentFrame(); - if (key == TwConsts::TK_UpArrow) + if (key == TwConsts::TK_UpArrow || key == TwConsts::TK_LeftArrow) fh->prevFrame(); - else if (key == TwConsts::TK_DownArrow) + else if (key == TwConsts::TK_DownArrow || key == TwConsts::TK_RightArrow) fh->nextFrame(); else if (key == TwConsts::TK_Home) fh->firstFrame(); @@ -1004,8 +1156,7 @@ void SceneViewer::mouseDoubleClickEvent(QMouseEvent *event) { TTool *tool = TApp::instance()->getCurrentTool()->getTool(); if (!tool || !tool->isEnabled()) return; TMouseEvent toonzEvent; - initToonzEvent(toonzEvent, event, height(), m_pressure, m_tabletEvent, true, - getDevPixRatio()); + initToonzEvent(toonzEvent, event, height(), 1.0, getDevPixRatio()); TPointD pos = tool->getMatrix().inv() * winToWorld(event->pos() * getDevPixRatio()); TObjectHandle *objHandle = TApp::instance()->getCurrentObject(); diff --git a/toonz/sources/toonz/startuppopup.cpp b/toonz/sources/toonz/startuppopup.cpp index 40df5b7..dad84c4 100644 --- a/toonz/sources/toonz/startuppopup.cpp +++ b/toonz/sources/toonz/startuppopup.cpp @@ -362,8 +362,13 @@ void StartupPopup::showEvent(QShowEvent *) { // clear items if they exist first refreshRecentScenes(); // center window - this->move(QApplication::desktop()->screen()->rect().center() - - this->rect().center()); + int currentScreen = + QApplication::desktop()->screenNumber(TApp::instance()->getMainWindow()); + QPoint activeMonitorCenter = + QApplication::desktop()->availableGeometry(currentScreen).center(); + QPoint thisPopupCenter = this->rect().center(); + QPoint centeredOnActiveMonitor = activeMonitorCenter - thisPopupCenter; + this->move(centeredOnActiveMonitor); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/subcameramanager.cpp b/toonz/sources/toonz/subcameramanager.cpp index 0b53d45..3975403 100644 --- a/toonz/sources/toonz/subcameramanager.cpp +++ b/toonz/sources/toonz/subcameramanager.cpp @@ -115,11 +115,11 @@ TPoint PreviewSubCameraManager::cameraToWin(SceneViewer *viewer, //---------------------------------------------------------------------- bool PreviewSubCameraManager::mousePressEvent(SceneViewer *viewer, - QMouseEvent *event) { + const TMouseEvent &event) { if (viewer->is3DView()) return true; m_mousePressed = true; - m_mousePressPos = event->pos() * viewer->getDevPixRatio(); + m_mousePressPos = event.mousePos() * viewer->getDevPixRatio(); m_dragType = getSubCameraDragEnum(viewer, m_mousePressPos); if (bitwiseExclude(m_dragType, OUTER)) @@ -131,10 +131,10 @@ bool PreviewSubCameraManager::mousePressEvent(SceneViewer *viewer, //---------------------------------------------------------------------- bool PreviewSubCameraManager::mouseMoveEvent(SceneViewer *viewer, - QMouseEvent *event) { + const TMouseEvent &event) { if (viewer->is3DView()) return true; - QPoint curPos(event->pos() * viewer->getDevPixRatio()); - if (event->buttons() == Qt::LeftButton) { + QPoint curPos(event.mousePos() * viewer->getDevPixRatio()); + if (event.buttons() == Qt::LeftButton) { if (!bitwiseContains(m_dragType, INNER)) { if (abs(curPos.x() - m_mousePressPos.x()) > 10 || abs(curPos.y() - m_mousePressPos.y()) > 10) @@ -230,13 +230,12 @@ bool PreviewSubCameraManager::mouseMoveEvent(SceneViewer *viewer, } // In case, perform the pan - return event->buttons() == Qt::MidButton; + return event.buttons() == Qt::MidButton; } //---------------------------------------------------------------------- -bool PreviewSubCameraManager::mouseReleaseEvent(SceneViewer *viewer, - QMouseEvent *event) { +bool PreviewSubCameraManager::mouseReleaseEvent(SceneViewer *viewer) { if (viewer->is3DView()) return true; m_mousePressed = false; diff --git a/toonz/sources/toonz/subcameramanager.h b/toonz/sources/toonz/subcameramanager.h index e77e9d5..44c42b0 100644 --- a/toonz/sources/toonz/subcameramanager.h +++ b/toonz/sources/toonz/subcameramanager.h @@ -99,9 +99,9 @@ public: TRectD getEditingCameraInterestStageRect() const; - bool mousePressEvent(SceneViewer *viewer, QMouseEvent *event) override; - bool mouseMoveEvent(SceneViewer *viewer, QMouseEvent *event) override; - bool mouseReleaseEvent(SceneViewer *viewer, QMouseEvent *event) override; + bool mousePressEvent(SceneViewer *viewer, const TMouseEvent &event); + bool mouseMoveEvent(SceneViewer *viewer, const TMouseEvent &event); + bool mouseReleaseEvent(SceneViewer *viewer); void deleteSubCamera(SceneViewer *viewer); diff --git a/toonz/sources/toonz/tapp.cpp b/toonz/sources/toonz/tapp.cpp index 5988f2c..8318336 100644 --- a/toonz/sources/toonz/tapp.cpp +++ b/toonz/sources/toonz/tapp.cpp @@ -726,6 +726,7 @@ bool TApp::eventFilter(QObject *watched, QEvent *e) { qApp->processEvents(); m_isPenCloseToTablet = false; + emit tabletLeft(); } return false; // I want just peek at the event. It must be processed anyway. diff --git a/toonz/sources/toonz/tapp.h b/toonz/sources/toonz/tapp.h index e057482..22e6ee6 100644 --- a/toonz/sources/toonz/tapp.h +++ b/toonz/sources/toonz/tapp.h @@ -232,6 +232,16 @@ protected slots: void onToolEditingFinished(); void onStartAutoSave(); void onStopAutoSave(); + +signals: + // on OSX, there is a critical bug that SceneViewer::mousePressEvent is called + // when leaving the stylus and it causes unwanted stroke drawn while + // hover-moving of the pen. + // This signal is to detect tablet leave and force initializing such irregular + // mouse press. + // NOTE: For now QEvent::TabletLeaveProximity is NOT detected on Windows. See + // QTBUG-53628. + void tabletLeft(); }; #endif // TAPP_H diff --git a/toonz/sources/toonz/tasksviewer.cpp b/toonz/sources/toonz/tasksviewer.cpp index 1b2a985..b4941d3 100644 --- a/toonz/sources/toonz/tasksviewer.cpp +++ b/toonz/sources/toonz/tasksviewer.cpp @@ -53,10 +53,10 @@ void TasksViewer::add(const QString &iconName, QString text, QToolBar *toolBar, const char *slot, QString iconText) { #if QT_VERSION >= 0x050500 QAction *action = new QAction( - createQIconOnOffPNG(iconName.toLatin1().constData(), false), text, this); + createQIconOnOff(iconName.toLatin1().constData(), false), text, this); #else QAction *action = new QAction( - createQIconOnOffPNG(iconName.toAscii().constData(), false), text, this); + createQIconOnOff(iconName.toAscii().constData(), false), text, this); #endif action->setIconText(iconText); bool ret = connect(action, SIGNAL(triggered(bool)), @@ -1021,6 +1021,7 @@ TaskTreeView::TaskTreeView(TasksViewer *parent, TaskTreeModel *treeModel) if (!treeModel) treeModel = new TaskTreeModel(this); setModel(treeModel); setObjectName("taskeditortree"); + setIconSize(QSize(21, 17)); // connect(this, SIGNAL(pressed (const QModelIndex &) ), this, // SLOT(onActivated(const QModelIndex &))); @@ -1130,7 +1131,7 @@ QVariant TaskTreeModel::data(const QModelIndex &index, int role) const { case 0: return QVariant(); case 1: - return QIcon(":Resources/farm_tasks.png"); + return QIcon(":Resources/farm_tasks.svg"); case 2: case 3: TFarmTask *t = item->getTask(); @@ -1138,33 +1139,33 @@ QVariant TaskTreeModel::data(const QModelIndex &index, int role) const { switch (t->m_status) { case Suspended: return QIcon(t->m_isComposerTask - ? ":Resources/render_suspended.png" + ? ":Resources/render_suspended.svg" : (sourceFileIsCLN - ? ":Resources/cln_suspended.png" - : ":Resources/cleanup_suspended.png")); + ? ":Resources/cln_suspended.svg" + : ":Resources/cleanup_suspended.svg")); case Waiting: return QIcon(t->m_isComposerTask - ? ":Resources/render_done_with_errors.png" + ? ":Resources/render_done_with_errors.svg" : (sourceFileIsCLN - ? ":Resources/cln_done_with_errors.png" - : ":Resources/cleanup_done_with_errors.png")); + ? ":Resources/cln_done_with_errors.svg" + : ":Resources/cleanup_done_with_errors.svg")); case Running: return QIcon(t->m_isComposerTask - ? ":Resources/render_computing.png" + ? ":Resources/render_computing.svg" : (sourceFileIsCLN - ? ":Resources/cln_computing.png" - : ":Resources/cleanup_computing.png")); + ? ":Resources/cln_computing.svg" + : ":Resources/cleanup_computing.svg")); case Completed: return QIcon(t->m_isComposerTask - ? ":Resources/render_done.png" - : (sourceFileIsCLN ? ":Resources/cln_done.png" - : ":Resources/cleanup_done.png")); + ? ":Resources/render_done.svg" + : (sourceFileIsCLN ? ":Resources/cln_done.svg" + : ":Resources/cleanup_done.svg")); case Aborted: case TaskUnknown: return QIcon(t->m_isComposerTask - ? ":Resources/render_failed.png" - : (sourceFileIsCLN ? ":Resources/cln_failed.png" - : ":Resources/cleanup_failed.png")); + ? ":Resources/render_failed.svg" + : (sourceFileIsCLN ? ":Resources/cln_failed.svg" + : ":Resources/cleanup_failed.svg")); default: assert(false); } diff --git a/toonz/sources/toonz/toonz.qrc b/toonz/sources/toonz/toonz.qrc index af625c0..bf68852 100644 --- a/toonz/sources/toonz/toonz.qrc +++ b/toonz/sources/toonz/toonz.qrc @@ -33,25 +33,25 @@ Resources/centerHTitle.png Resources/centerHTitle_inactive.png Resources/centerVTitle.png - Resources/channelblue.png - Resources/channelblue_click.png - Resources/channelblue_over.png - Resources/channelgreen.png - Resources/channelgreen_click.png - Resources/channelgreen_over.png - Resources/channelmatte.png - Resources/channelmatte_click.png - Resources/channelmatte_over.png - Resources/channelred.png - Resources/channelred_click.png - Resources/channelred_over.png + Resources/channelblue.svg + Resources/channelblue_click.svg + Resources/channelblue_over.svg + Resources/channelgreen.svg + Resources/channelgreen_click.svg + Resources/channelgreen_over.svg + Resources/channelmatte.svg + Resources/channelmatte_click.svg + Resources/channelmatte_over.svg + Resources/channelred.svg + Resources/channelred_click.svg + Resources/channelred_over.svg Resources/check.png Resources/clapboard.png - Resources/cleanup_failed.png - Resources/cleanup_done.png - Resources/cleanup_done_with_errors.png - Resources/cleanup_computing.png - Resources/cleanup_suspended.png + Resources/cleanup_failed.svg + Resources/cleanup_done.svg + Resources/cleanup_done_with_errors.svg + Resources/cleanup_computing.svg + Resources/cleanup_suspended.svg Resources/close_pane.png Resources/close_pane_rollover.png Resources/closedfolder.png @@ -60,9 +60,9 @@ Resources/collapse_over.png Resources/controlpointeditor.svg Resources/controlpointeditor_rollover.svg - Resources/compare.png - Resources/compare_click.png - Resources/compare_over.png + Resources/compare.svg + Resources/compare_click.svg + Resources/compare_over.svg Resources/curve.png Resources/custom_off.svg Resources/custom_on.svg @@ -79,7 +79,7 @@ Resources/eraser.png Resources/eraser.svg Resources/eraser_rollover.svg - Resources/farm_tasks.png + Resources/farm_tasks.svg Resources/fill.png Resources/fill.svg Resources/fill_rollover.svg @@ -88,20 +88,20 @@ Resources/folder_new_over.png Resources/folderpreset_open.png Resources/folderpreset_close.png - Resources/folderup.png - Resources/folderup_over.png - Resources/framefirst.png - Resources/framefirst_click.png - Resources/framefirst_over.png - Resources/framelast.png - Resources/framelast_click.png - Resources/framelast_over.png - Resources/framenext.png - Resources/framenext_click.png - Resources/framenext_over.png - Resources/frameprev.png - Resources/frameprev_click.png - Resources/frameprev_over.png + Resources/folderup.svg + Resources/folderup_over.svg + Resources/framefirst.svg + Resources/framefirst_click.svg + Resources/framefirst_over.svg + Resources/framelast.svg + Resources/framelast_click.svg + Resources/framelast_over.svg + Resources/framenext.svg + Resources/framenext_click.svg + Resources/framenext_over.svg + Resources/frameprev.svg + Resources/frameprev_click.svg + Resources/frameprev_over.svg Resources/freeze.png Resources/freeze_on.png Resources/freeze_over.png @@ -114,8 +114,8 @@ Resources/h_slider.png Resources/hand.svg Resources/hand_rollover.svg - Resources/histograms.png - Resources/histograms_over.png + Resources/histograms.svg + Resources/histograms_over.svg Resources/history.png Resources/hook.svg Resources/hook_rollover.svg @@ -143,9 +143,9 @@ Resources/link_parent.bmp Resources/lock.png Resources/lock_over.png - Resources/loop.png - Resources/loop_click.png - Resources/loop_over.png + Resources/loop.svg + Resources/loop_click.svg + Resources/loop_over.svg Resources/lock_toggle.png Resources/magnet.png Resources/magnet.svg @@ -167,11 +167,8 @@ Resources/new_vector_level.png Resources/new_vector_level_click.png Resources/new_vector_level_over.png - Resources/newmemo.png - Resources/newmemo_disabled.png - Resources/newpage.png - Resources/newpage_click.png - Resources/newpage_over.png + Resources/newmemo.svg + Resources/newmemo_disabled.svg Resources/newstyle.png Resources/newstyle_click.png Resources/newstyle_over.png @@ -180,6 +177,7 @@ Resources/nextkey_over.png Resources/no_specialstyle.png Resources/no_vectorbrush.png + Resources/no_mypaintbrush.png Resources/openedfolder.png Resources/options.png Resources/options_click.png @@ -197,10 +195,10 @@ Resources/palette_view_mode.bmp Resources/paletteicon.png Resources/pan.png - Resources/pause.png - Resources/pause_click.png - Resources/pause_disabled.png - Resources/pause_over.png + Resources/pause.svg + Resources/pause_click.svg + Resources/pause_disabled.svg + Resources/pause_over.svg Resources/pegging_top_arrow.png Resources/pegging_topright_arrow.png Resources/pen.png @@ -216,10 +214,10 @@ Resources/plaincolor_on.svg Resources/plastic.svg Resources/plastic_rollover.svg - Resources/play.png - Resources/play_click.png - Resources/play_disabled.png - Resources/play_over.png + Resources/play.svg + Resources/play_click.svg + Resources/play_disabled.svg + Resources/play_over.svg Resources/preview_toggle.png Resources/previuos_folder.png Resources/prevkey.png @@ -230,15 +228,15 @@ Resources/pump.png Resources/pump.svg Resources/pump_rollover.svg - Resources/record.png - Resources/record_click.png - Resources/record_disabled.png - Resources/record_over.png - Resources/render_failed.png - Resources/render_done.png - Resources/render_done_with_errors.png - Resources/render_computing.png - Resources/render_suspended.png + Resources/record.svg + Resources/record_click.svg + Resources/record_disabled.svg + Resources/record_over.svg + Resources/render_failed.svg + Resources/render_done.svg + Resources/render_done_with_errors.svg + Resources/render_computing.svg + Resources/render_suspended.svg Resources/repeat_icon.png Resources/repeat_icon_click.png Resources/repeat_icon_over.png @@ -270,30 +268,30 @@ Resources/shear.png Resources/skeleton.svg Resources/skeleton_rollover.svg - Resources/snapshot.png - Resources/snapshot_click.png - Resources/snapshot_over.png - Resources/sound.png - Resources/sound_click.png - Resources/sound_over.png + Resources/snapshot.svg + Resources/snapshot_click.svg + Resources/snapshot_over.svg + Resources/sound.svg + Resources/sound_click.svg + Resources/sound_over.svg Resources/sound_header_off.png Resources/sound_header_on.png Resources/sound_toggle.png Resources/special_off.svg Resources/special_on.svg - Resources/splash.png + Resources/splash.svg Resources/standard.png Resources/standard_on.png Resources/standard_over.png Resources/startup.png - Resources/start_off.png - Resources/start_on.png - Resources/stop.png - Resources/stop_click.png - Resources/stop_disabled.png - Resources/stop_over.png - Resources/stop_off.png - Resources/stop_on.png + Resources/start_off.svg + Resources/start_on.svg + Resources/stop.svg + Resources/stop_click.svg + Resources/stop_disabled.svg + Resources/stop_over.svg + Resources/stop_off.svg + Resources/stop_on.svg Resources/stroke_select.png Resources/stylepicker.svg Resources/stylepicker_rollover.svg @@ -307,8 +305,8 @@ Resources/sub_leave.png Resources/sub_leave_over.png Resources/sub_leave_click.png - Resources/swap_off.png - Resources/swap_on.png + Resources/swap_off.svg + Resources/swap_on.svg Resources/svg.png Resources/switch.png Resources/switch_on.png @@ -338,12 +336,12 @@ Resources/view_camera.png Resources/view_camera_on.png Resources/view_camera_over.png - Resources/viewicon_off.png - Resources/viewicon_on.png - Resources/viewicon_over.png - Resources/viewlist_off.png - Resources/viewlist_on.png - Resources/viewlist_over.png + Resources/viewicon_off.svg + Resources/viewicon_on.svg + Resources/viewicon_over.svg + Resources/viewlist_off.svg + Resources/viewlist_on.svg + Resources/viewlist_over.svg Resources/viewpreview.png Resources/viewpreview_on.png Resources/viewpreview_over.png @@ -360,30 +358,30 @@ Resources/browser_scene_close.png Resources/browser_project_open.png Resources/browser_project_close.png - Resources/half_R.png - Resources/half_R_click.png - Resources/half_R_over.png - Resources/half_G.png - Resources/half_G_click.png - Resources/half_G_over.png - Resources/half_B.png - Resources/half_B_click.png - Resources/half_B_over.png - Resources/half_bw.png - Resources/half_bw_click.png - Resources/half_bw_over.png - Resources/addcleanup_off.png - Resources/addcleanup_on.png - Resources/addrender_off.png - Resources/addrender_on.png - Resources/delete_off.png - Resources/delete_on.png - Resources/save_off.png - Resources/save_on.png - Resources/saveas_off.png - Resources/saveas_on.png - Resources/load_off.png - Resources/load_on.png + Resources/half_R.svg + Resources/half_R_click.svg + Resources/half_R_over.svg + Resources/half_G.svg + Resources/half_G_click.svg + Resources/half_G_over.svg + Resources/half_B.svg + Resources/half_B_click.svg + Resources/half_B_over.svg + Resources/half_bw.svg + Resources/half_bw_click.svg + Resources/half_bw_over.svg + Resources/addcleanup_off.svg + Resources/addcleanup_on.svg + Resources/addrender_off.svg + Resources/addrender_on.svg + Resources/delete_off.svg + Resources/delete_on.svg + Resources/save_off.svg + Resources/save_on.svg + Resources/saveas_off.svg + Resources/saveas_on.svg + Resources/load_off.svg + Resources/load_on.svg Resources/flip_h.png Resources/flip_v.png Resources/level_select.png @@ -404,23 +402,23 @@ Resources/halfRed.png Resources/halfBronze.png Resources/plus.png - Resources/missing.png + Resources/missing.svg Resources/forbidden.png - Resources/define_subcamera_preview.png - Resources/define_subcamera_preview_over.png - Resources/define_subcamera_preview_click.png - Resources/use_subcamera_preview.png - Resources/use_subcamera_preview_over.png - Resources/use_subcamera_preview_click.png + Resources/define_subcamera_preview.svg + Resources/define_subcamera_preview_over.svg + Resources/define_subcamera_preview_click.svg + Resources/use_subcamera_preview.svg + Resources/use_subcamera_preview_over.svg + Resources/use_subcamera_preview_click.svg Resources/subcamera_preview.png Resources/subcamera_preview_over.png Resources/subcamera_preview_on.png - Resources/round_cap.png - Resources/butt_cap.png - Resources/projecting_cap.png - Resources/round_join.png - Resources/bevel_join.png - Resources/miter_join.png + Resources/round_cap.svg + Resources/butt_cap.svg + Resources/projecting_cap.svg + Resources/round_join.svg + Resources/bevel_join.svg + Resources/miter_join.svg Resources/init.js Resources/scripticon.png Resources/safearea.png @@ -434,10 +432,10 @@ Resources/folderup_icon.png Resources/link_icon.png Resources/folder_icon.png - Resources/fb_history_back_enable.png - Resources/fb_history_back_disable.png - Resources/fb_history_fwd_enable.png - Resources/fb_history_fwd_disable.png + Resources/fb_history_back_enable.svg + Resources/fb_history_back_disable.svg + Resources/fb_history_fwd_enable.svg + Resources/fb_history_fwd_disable.svg Resources/x_prev_eye.png Resources/x_table_view.png Resources/x_table_view_transp.png @@ -459,11 +457,11 @@ Resources/history_xsheet.png Resources/history_filmstrip.png Resources/history_unidentified.png - Resources/cln_suspended.png - Resources/cln_done_with_errors.png - Resources/cln_computing.png - Resources/cln_done.png - Resources/cln_failed.png + Resources/cln_suspended.svg + Resources/cln_done_with_errors.svg + Resources/cln_computing.svg + Resources/cln_done.svg + Resources/cln_failed.svg Resources/match_lup_nogap.png Resources/match_rup_nogap.png Resources/match_lup_gap.png @@ -472,10 +470,10 @@ Resources/finger_rollover.svg Resources/ruler.svg Resources/ruler_rollover.svg - Resources/locator.png - Resources/locator_click.png - Resources/locator_over.png - Resources/refresh.png - Resources/refresh_over.png + Resources/locator.svg + Resources/locator_click.svg + Resources/locator_over.svg + Resources/refresh.svg + Resources/refresh_over.svg diff --git a/toonz/sources/toonz/vectorizerpopup.cpp b/toonz/sources/toonz/vectorizerpopup.cpp index 3aa13db..0b1335f 100644 --- a/toonz/sources/toonz/vectorizerpopup.cpp +++ b/toonz/sources/toonz/vectorizerpopup.cpp @@ -451,6 +451,10 @@ VectorizerPopup::VectorizerPopup(QWidget *parent, Qt::WFlags flags) addWidget(splitter); QToolBar *leftToolBar = new QToolBar, *rightToolBar = new QToolBar; + leftToolBar->setObjectName("MediumPaddingToolBar"); + rightToolBar->setObjectName("MediumPaddingToolBar"); + leftToolBar->setIconSize(QSize(17, 17)); + rightToolBar->setIconSize(QSize(17, 17)); { QWidget *toolbarsContainer = new QWidget(this); toolbarsContainer->setFixedHeight(22); @@ -732,19 +736,18 @@ paramsLayout->addWidget(m_cThicknessRatio, row++, 1);*/ //---------------------- Toolbar -------------------------- - QAction *swatchAct = new QAction(createQIconOnOffPNG("preview", true), + QAction *swatchAct = new QAction(createQIconOnOff("preview", true), tr("Toggle Swatch Preview"), this); swatchAct->setCheckable(true); leftToolBar->addAction(swatchAct); - QAction *centerlineAct = - new QAction(createQIconOnOffPNG("opacitycheck", true), - tr("Toggle Centerlines Check"), this); + QAction *centerlineAct = new QAction(createQIconOnOff("opacitycheck", true), + tr("Toggle Centerlines Check"), this); centerlineAct->setCheckable(true); leftToolBar->addAction(centerlineAct); QToolButton *visibilityButton = new QToolButton(this); - visibilityButton->setIcon(createQIconPNG("options")); + visibilityButton->setIcon(createQIcon("options")); visibilityButton->setPopupMode(QToolButton::InstantPopup); QMenu *visibilityMenu = new QMenu(visibilityButton); @@ -753,15 +756,15 @@ paramsLayout->addWidget(m_cThicknessRatio, row++, 1);*/ rightToolBar->addWidget(visibilityButton); rightToolBar->addSeparator(); - QAction *saveAct = new QAction(createQIconOnOffPNG("save", false), - tr("Save Settings"), this); + QAction *saveAct = + new QAction(createQIconOnOff("save", false), tr("Save Settings"), this); rightToolBar->addAction(saveAct); - QAction *loadAct = new QAction(createQIconOnOffPNG("load", false), - tr("Load Settings"), this); + QAction *loadAct = + new QAction(createQIconOnOff("load", false), tr("Load Settings"), this); rightToolBar->addAction(loadAct); rightToolBar->addSeparator(); - QAction *resetAct = new QAction(createQIconOnOffPNG("resetsize", false), + QAction *resetAct = new QAction(createQIconOnOff("resetsize", false), tr("Reset Settings"), this); rightToolBar->addAction(resetAct); diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index e64c9d9..e036c82 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -241,9 +241,11 @@ void SceneViewerPanel::showEvent(QShowEvent *event) { ret = ret && connect(xshHandle, SIGNAL(xsheetChanged()), this, SLOT(onSceneChanged())); - + ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this, + SLOT(onSceneChanged())); ret = ret && connect(sceneHandle, SIGNAL(sceneChanged()), this, SLOT(onSceneChanged())); + ret = ret && connect(sceneHandle, SIGNAL(nameSceneChanged()), this, SLOT(changeWindowTitle())); @@ -289,7 +291,8 @@ void SceneViewerPanel::hideEvent(QHideEvent *event) { disconnect(sceneHandle, SIGNAL(sceneChanged()), this, SLOT(onSceneChanged())); disconnect(sceneHandle, SIGNAL(nameSceneChanged()), this, SLOT(changeWindowTitle())); - + disconnect(sceneHandle, SIGNAL(sceneSwitched()), this, + SLOT(onSceneChanged())); disconnect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), this, SLOT(onXshLevelSwitched(TXshLevel *))); disconnect(levelHandle, SIGNAL(xshLevelChanged()), this, @@ -470,7 +473,16 @@ void SceneViewerPanel::enableFlipConsoleForCamerastand(bool on) { //----------------------------------------------------------------------------- -void SceneViewerPanel::onXshLevelSwitched(TXshLevel *) { changeWindowTitle(); } +void SceneViewerPanel::onXshLevelSwitched(TXshLevel *) { + changeWindowTitle(); + m_sceneViewer->update(); + // If the level switched by using the level choose combo box in the film + // strip, + // the current level switches without change in the frame type (level or + // scene). + // For such case, update the frame range of the console here. + if (TApp::instance()->getCurrentFrame()->isEditingLevel()) updateFrameRange(); +} //----------------------------------------------------------------------------- @@ -588,6 +600,14 @@ void SceneViewerPanel::onSceneChanged() { TApp *app = TApp::instance(); ToonzScene *scene = app->getCurrentScene()->getScene(); assert(scene); + // update fps only when the scene settings is changed + m_flipConsole->setFrameRate(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProperties() + ->getOutputProperties() + ->getFrameRate(), + false); // vinz: perche veniva fatto? // m_flipConsole->updateCurrentFPS(scene->getProperties()->getOutputProperties()->getFrameRate()); @@ -686,6 +706,8 @@ void SceneViewerPanel::playAudioFrame(int frame) { false); } +//----------------------------------------------------------------------------- + bool SceneViewerPanel::hasSoundtrack() { if (m_sound != NULL) { m_sound = NULL; diff --git a/toonz/sources/toonz/viewerpane.h b/toonz/sources/toonz/viewerpane.h index 48e5c11..327c130 100644 --- a/toonz/sources/toonz/viewerpane.h +++ b/toonz/sources/toonz/viewerpane.h @@ -57,6 +57,9 @@ public: void onDrawFrame(int frame, const ImagePainter::VisualSettings &settings) override; + bool widgetInThisPanelIsFocused() override { + return m_sceneViewer->hasFocus(); + } protected: void showEvent(QShowEvent *) override; @@ -66,6 +69,13 @@ protected: void createFrameToolBar(); void createPlayToolBar(); void addColorMaskButton(QWidget *parent, const char *iconSVGName, int id); + // reimplementation of TPanel::widgetFocusOnEnter + void widgetFocusOnEnter() override { + m_sceneViewer->setFocus(Qt::OtherFocusReason); + // activate shortcut key for this flipconsole + m_flipConsole->makeCurrent(); + }; + void widgetClearFocusOnLeave() override { m_sceneViewer->clearFocus(); }; void enableFlipConsoleForCamerastand(bool on); void playAudioFrame(int frame); bool hasSoundtrack(); diff --git a/toonz/sources/toonz/xshcellmover.cpp b/toonz/sources/toonz/xshcellmover.cpp index 89052c6..60359e7 100644 --- a/toonz/sources/toonz/xshcellmover.cpp +++ b/toonz/sources/toonz/xshcellmover.cpp @@ -371,9 +371,10 @@ qDebug() << "check: " << srcIndex << ":" << } void LevelMoverTool::onClick(const QMouseEvent *e) { - QPoint pos = e->pos(); - int row = getViewer()->yToRow(pos.y()); - int col = getViewer()->xToColumn(pos.x()); + QPoint pos = e->pos(); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); m_qualifiers = 0; if (Preferences::instance()->getDragCellsBehaviour() == 1) @@ -509,13 +510,13 @@ void LevelMoverTool::onCellChange(int row, int col) { } void LevelMoverTool::onDrag(const QMouseEvent *e) { - QPoint pos = e->pos(); - onCellChange(getViewer()->yToRow(pos.y()), getViewer()->xToColumn(pos.x())); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + onCellChange(cellPosition.frame(), cellPosition.layer()); refreshCellsArea(); refreshColumnsArea(); } -void LevelMoverTool::onRelease(int row, int col) { +void LevelMoverTool::onRelease(const CellPosition &pos) { m_validPos = false; m_range.lx = 0; m_range.ly = 0; @@ -534,15 +535,13 @@ void LevelMoverTool::drawCellsArea(QPainter &p) { if (rect.x1 < 0 || rect.y1 < 0) return; if (rect.x0 < 0) rect.x0 = 0; if (rect.y0 < 0) rect.y0 = 0; - int x0, y0, x1, y1; - x0 = getViewer()->columnToX(rect.x0); - x1 = getViewer()->columnToX(rect.x1 + 1); - y0 = getViewer()->rowToY(rect.y0); - y1 = getViewer()->rowToY(rect.y1 + 1); - int x = x1 - x0; - int y = y1 - y0; + + QRect screen = getViewer()->rangeToXYRect(CellRange( + CellPosition(rect.y0, rect.x0), CellPosition(rect.y1 + 1, rect.x1 + 1))); p.setPen((m_aimedPos == m_lastPos && m_validPos) ? QColor(190, 220, 255) : QColor(255, 0, 0)); int i; - for (i = 0; i < 3; i++) p.drawRect(x0 + i, y0 + i, x - 2 * i, y - 2 * i); + for (i = 0; i < 3; i++) // thick border inside cell + p.drawRect(QRect(screen.topLeft() + QPoint(i, i), + screen.size() - QSize(2 * i, 2 * i))); } diff --git a/toonz/sources/toonz/xshcellmover.h b/toonz/sources/toonz/xshcellmover.h index ec63cee..ef54568 100644 --- a/toonz/sources/toonz/xshcellmover.h +++ b/toonz/sources/toonz/xshcellmover.h @@ -89,7 +89,7 @@ private: class LevelMoverTool : public XsheetGUI::DragTool { protected: TPoint m_grabOffset; - TPoint m_startPos, m_lastPos, m_aimedPos; + TPoint m_startPos, m_lastPos, m_aimedPos; // x=col, y=row coordinates TDimension m_range; int m_qualifiers; @@ -109,7 +109,7 @@ public: void onClick(const QMouseEvent *e) override; void onCellChange(int row, int col); void onDrag(const QMouseEvent *e) override; - void onRelease(int row, int col) override; + void onRelease(const CellPosition &pos) override; void drawCellsArea(QPainter &p) override; }; diff --git a/toonz/sources/toonz/xshcellviewer.cpp b/toonz/sources/toonz/xshcellviewer.cpp index eaaf089..c64c40c 100644 --- a/toonz/sources/toonz/xshcellviewer.cpp +++ b/toonz/sources/toonz/xshcellviewer.cpp @@ -16,6 +16,7 @@ #include "cellkeyframeselection.h" #include "keyframedata.h" #include "columnselection.h" +#include "orientation.h" // TnzTools includes #include "tools/cursormanager.h" @@ -506,6 +507,8 @@ RenameCellField::RenameCellField(QWidget *parent, XsheetViewer *viewer) //----------------------------------------------------------------------------- void RenameCellField::showInRowCol(int row, int col, bool multiColumnSelected) { + const Orientation *o = m_viewer->orientation(); + m_viewer->scrollTo(row, col); m_row = row; @@ -544,9 +547,10 @@ void RenameCellField::showInRowCol(int row, int col, bool multiColumnSelected) { setStyleSheet(styleSheetStr); TXshCell cell = xsh->getCell(row, col); + QPoint xy = m_viewer->positionToXY(CellPosition(row, col)) - QPoint(1, 2); if (!cell.isEmpty()) { - setFixedSize(XsheetGUI::ColumnWidth - 5, XsheetGUI::RowHeight + 4); - move(QPoint(m_viewer->columnToX(col) + 7, m_viewer->rowToY(row) - 2)); + setFixedSize(o->cellWidth(), o->cellHeight() + 2); + move(xy + QPoint(1, 1)); TFrameId fid = cell.getFrameId(); std::wstring levelName = cell.m_level->getName(); @@ -576,8 +580,8 @@ void RenameCellField::showInRowCol(int row, int col, bool multiColumnSelected) { } // clear the field if the empty cell is clicked else { - setFixedSize(XsheetGUI::ColumnWidth + 3, XsheetGUI::RowHeight + 4); - move(QPoint(m_viewer->columnToX(col) - 1, m_viewer->rowToY(row) - 2)); + setFixedSize(o->cellWidth(), o->cellHeight() + 2); + move(xy + QPoint(1, 1)); setText(""); } @@ -756,43 +760,42 @@ void RenameCellField::keyPressEvent(QKeyEvent *event) { } int r0, c0, r1, c1; + CellPosition stride(1, 1); // stride in row and column axes cellSelection->getSelectedCells(r0, c0, r1, c1); - int rowStride = r1 - r0 + 1; + stride.setFrame(cellSelection->getSelectedCells().getRowCount()); - QPoint offset(0, 0); + CellPosition offset; switch (int key = event->key()) { case Qt::Key_Up: - offset.setY(-1); - break; case Qt::Key_Down: - offset.setY(1); - break; case Qt::Key_Left: - offset.setX(-1); - break; case Qt::Key_Right: - offset.setX(1); + offset = m_viewer->orientation()->arrowShift(key); break; default: QLineEdit::keyPressEvent(event); return; break; } + if (isCtrlPressed && Preferences::instance()->isUseArrowKeyToShiftCellSelectionEnabled()) { - if (r0 == r1 && offset.y() == -1) return; - if (c0 == c1 && offset.x() == -1) return; - cellSelection->selectCells(r0, c0, r1 + offset.y(), c1 + offset.x()); + if (r0 == r1 && offset.frame() == -1) return; + if (c0 == c1 && offset.layer() == -1) return; + cellSelection->selectCells(r0, c0, r1 + offset.frame(), + c1 + offset.layer()); } else { - offset.setY(offset.y() * rowStride); - if (r0 + offset.y() < 0) offset.setY(-r0); - if (c0 + offset.x() < 0) return; + CellPosition offset(offset * stride); + int movedR0 = std::max(0, r0 + offset.frame()); + int movedC0 = std::max(0, c0 + offset.layer()); + int diffFrame = movedR0 - r0; + int diffLayer = movedC0 - c0; // It needs to be discussed - I made not to rename cell with arrow key. // 19/Jan/2017 shun-iwasawa // renameCell(); - cellSelection->selectCells(r0 + offset.y(), c0 + offset.x(), - r1 + offset.y(), c1 + offset.x()); - showInRowCol(m_row + offset.y(), m_col + offset.x(), c1 - c0 > 0); + cellSelection->selectCells(r0 + diffFrame, c0 + diffLayer, r1 + diffFrame, + c1 + diffLayer); + showInRowCol(m_row + offset.frame(), m_col + offset.layer(), c1 - c0 > 0); } m_viewer->updateCells(); TApp::instance()->getCurrentSelection()->notifySelectionChanged(); @@ -865,47 +868,27 @@ void CellArea::setDragTool(DragTool *dragTool) { void CellArea::drawCells(QPainter &p, const QRect toBeUpdated) { TXsheet *xsh = m_viewer->getXsheet(); - ColumnFan *columnFan = xsh->getColumnFan(); + ColumnFan *columnFan = xsh->getColumnFan(m_viewer->orientation()); + // selected cells range TCellSelection *cellSelection = m_viewer->getCellSelection(); int rS0, cS0, rS1, cS1; if (!cellSelection->isEmpty()) cellSelection->getSelectedCells(rS0, cS0, rS1, cS1); + // visible cells range + CellRange visible = m_viewer->xyRectToRange(toBeUpdated); int r0, r1, c0, c1; // range of visible rows and columns - r0 = m_viewer->yToRow(toBeUpdated.top()); - r1 = m_viewer->yToRow(toBeUpdated.bottom()); - c0 = m_viewer->xToColumn(toBeUpdated.left()); - c1 = m_viewer->xToColumn(toBeUpdated.right()); - - // Sfondo bianco se row < xsh->getFrameCount() - int xshRowCount = xsh->getFrameCount(); - - if (xshRowCount > 0) { - int filledCol; - for (filledCol = xsh->getColumnCount() - 1; filledCol >= 0; filledCol--) { - TXshColumn *currentColumn = xsh->getColumn(filledCol); - if (!currentColumn) continue; - if (currentColumn->isEmpty() == false) { - p.fillRect(1, 0, m_viewer->columnToX(filledCol + 1), - m_viewer->rowToY(xshRowCount), - QBrush(m_viewer->getNotEmptyColumnColor())); - break; - } - } - } - int xS0, xS1, yS0, yS1; + r0 = visible.from().frame(); + r1 = visible.to().frame(); + c0 = visible.from().layer(); + c1 = visible.to().layer(); - if (!cellSelection->isEmpty()) { - xS0 = m_viewer->columnToX(cS0); - xS1 = m_viewer->columnToX(cS1 + 1) - 1; - yS0 = m_viewer->rowToY(rS0); - yS1 = m_viewer->rowToY(rS1 + 1) - 1; - QRect rect = QRect(xS0, yS0, xS1 - xS0 + 1, yS1 - yS0 + 1); - p.fillRect(rect, QBrush(m_viewer->getSelectedEmptyCellColor())); - } + drawNonEmptyBackground(p); - // marker interval + drawSelectionBackground(p); + + // marker interval every 6 frames int distance, offset; TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( distance, offset); @@ -914,23 +897,22 @@ void CellArea::drawCells(QPainter &p, const QRect toBeUpdated) { int currentRow = m_viewer->getCurrentRow(); int col, row; - int x0 = std::max(1, toBeUpdated.left()); - int x1 = std::min(width(), toBeUpdated.right()); + int drawLeft = std::max(1, toBeUpdated.left()); + int drawRight = std::min(width(), toBeUpdated.right()); + + int drawTop = std::max(1, toBeUpdated.top()); + int drawBottom = std::min(height() - 2, toBeUpdated.bottom()); + QRect drawingArea(QPoint(drawLeft, drawTop), QPoint(drawRight, drawBottom)); + NumberRange frameSide = m_viewer->orientation()->frameSide(drawingArea); - int y0 = std::max(1, toBeUpdated.top()); - int y1 = std::min(height() - 2, toBeUpdated.bottom()); + // for each layer m_soundLevelModifyRects.clear(); for (col = c0; col <= c1; col++) { - int x = m_viewer->columnToX(col); - // Disegno la colonna - if (!columnFan->isActive(col)) { - p.fillRect(x + 1, y0, 2, y1 - y0 + 1, QBrush(Qt::white)); - p.fillRect(x + 4, y0, 2, y1 - y0 + 1, QBrush(Qt::white)); - p.fillRect(x + 7, y0, 2, y1 - y0 + 1, QBrush(Qt::white)); - p.setPen(m_viewer->getLightLineColor()); - p.drawLine(x, y0, x, y1); - p.drawLine(x + 3, y0, x + 3, y1); - p.drawLine(x + 6, y0, x + 6, y1); + // x in vertical timeline / y in horizontal + int layerAxis = m_viewer->columnToLayerAxis(col); + + if (!columnFan->isActive(col)) { // folded column + drawFoldedColumns(p, layerAxis, frameSide); continue; } @@ -952,24 +934,33 @@ void CellArea::drawCells(QPainter &p, const QRect toBeUpdated) { isReference = false; } - x0 = x + 1; - x1 = m_viewer->columnToX(col + 1); + NumberRange layerAxisRange(layerAxis + 1, + m_viewer->columnToLayerAxis(col + 1)); - // draw vertical lines - p.setPen(m_viewer->getVerticalLineColor()); - if (x > 0) p.drawLine(x, y0, x, y1); + // draw vertical line + if (layerAxis > 0) { + p.setPen(m_viewer->getVerticalLineColor()); + QLine verticalLine = + m_viewer->orientation()->verticalLine(layerAxis, frameSide); + p.drawLine(verticalLine); + } + // for each frame for (row = r0; row <= r1; row++) { // draw horizontal lines - QColor color = ((row - offset) % distance != 0) - ? m_viewer->getLightLineColor() - : m_viewer->getMarkerLineColor(); + // hide top-most marker line + QColor color = ((row - offset) % distance == 0 && row != 0) + ? m_viewer->getMarkerLineColor() + : m_viewer->getLightLineColor(); p.setPen(color); - int y = m_viewer->rowToY(row); - p.drawLine(x0, y, x1, y); + int frameAxis = m_viewer->rowToFrameAxis(row); + QLine horizontalLine = + m_viewer->orientation()->horizontalLine(frameAxis, layerAxisRange); + p.drawLine(horizontalLine); + if (!isColumn) continue; - // Disegno le celle a seconda del tipo di colonna + // Cells appearance depending on the type of column if (isSoundColumn) drawSoundCell(p, row, col); else if (isPaletteColumn) @@ -979,55 +970,144 @@ void CellArea::drawCells(QPainter &p, const QRect toBeUpdated) { else drawLevelCell(p, row, col, isReference); } + } + + drawExtenderHandles(p); +} + +// slightly bright background for non-empty rectangular area +void CellArea::drawNonEmptyBackground(QPainter &p) const { + TXsheet *xsh = m_viewer->getXsheet(); + + int totalFrames = xsh->getFrameCount(); + if (!totalFrames) return; + + int lastNonEmptyCol; + for (lastNonEmptyCol = xsh->getColumnCount() - 1; lastNonEmptyCol >= 0; + lastNonEmptyCol--) { + TXshColumn *currentColumn = xsh->getColumn(lastNonEmptyCol); + if (!currentColumn) continue; + if (!currentColumn->isEmpty()) break; + } + QPoint xy = + m_viewer->positionToXY(CellPosition(totalFrames, lastNonEmptyCol + 1)); + p.fillRect(1, 0, xy.x(), xy.y(), QBrush(m_viewer->getNotEmptyColumnColor())); +} - // hide top-most interval line - p.setPen(m_viewer->getLightLineColor()); - p.drawLine(x - 1, 0, x1 - 1, 0); +void CellArea::drawFoldedColumns(QPainter &p, int layerAxis, + const NumberRange &frameAxis) const { + // 3 white bars + for (int i = 0; i < 3; i++) { + QRect whiteRect = + m_viewer->orientation()->foldedRectangle(layerAxis, frameAxis, i); + p.fillRect(whiteRect, QBrush(Qt::white)); } - // smart tab - // initialize the rectangles first + // 3 dark lines + p.setPen(m_viewer->getLightLineColor()); + for (int i = 0; i < 3; i++) { + QLine darkLine = + m_viewer->orientation()->foldedRectangleLine(layerAxis, frameAxis, i); + p.drawLine(darkLine); + } +} + +void CellArea::drawSelectionBackground(QPainter &p) const { + // selected cells range + TCellSelection *cellSelection = m_viewer->getCellSelection(); + if (cellSelection->isEmpty()) return; + + int selRow0, selCol0, selRow1, selCol1; + cellSelection->getSelectedCells(selRow0, selCol0, selRow1, selCol1); + QRect selectionRect = m_viewer->rangeToXYRect(CellRange( + CellPosition(selRow0, selCol0), CellPosition(selRow1 + 1, selCol1 + 1))); + p.fillRect(selectionRect, QBrush(m_viewer->getSelectedEmptyCellColor())); +} + +void CellArea::drawExtenderHandles(QPainter &p) { + const Orientation *o = m_viewer->orientation(); + m_levelExtenderRect = QRect(); m_upperLevelExtenderRect = QRect(); - int smartTabPosOffset = - (Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled()) ? 31 - : 20; - if (!cellSelection->isEmpty() && !m_viewer->areSoundCellsSelected()) { - m_levelExtenderRect = QRect(xS1 - smartTabPosOffset, yS1 + 1, 19, 8); + + // selected cells range + TCellSelection *cellSelection = m_viewer->getCellSelection(); + if (cellSelection->isEmpty() || m_viewer->areSoundCellsSelected()) return; + + int selRow0, selCol0, selRow1, selCol1; + cellSelection->getSelectedCells(selRow0, selCol0, selRow1, selCol1); + QRect selected = m_viewer->rangeToXYRect(CellRange( + CellPosition(selRow0, selCol0), CellPosition(selRow1 + 1, selCol1 + 1))); + + int x0, y0, x1, y1; + x0 = selected.left(); + x1 = selected.right(); + y0 = selected.top(); + y1 = selected.bottom(); + + // smart tab + QPoint smartTabPosOffset = + Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled() + ? QPoint(0, 0) + : o->point(PredefinedPoint::KEY_HIDDEN); + + int distance, offset; + TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( + distance, offset); + if (distance == 0) distance = 6; + + QPoint xyRadius = o->point(PredefinedPoint::EXTENDER_XY_RADIUS); + + // bottom / right extender handle + m_levelExtenderRect = + o->rect(PredefinedRect::END_EXTENDER) + .translated(selected.bottomRight() + smartTabPosOffset); + p.setPen(Qt::black); + p.setBrush(SmartTabColor); + p.drawRoundRect(m_levelExtenderRect, xyRadius.x(), xyRadius.y()); + QColor color = ((selRow1 + 1 - offset) % distance != 0) + ? m_viewer->getLightLineColor() + : m_viewer->getMarkerLineColor(); + p.setPen(color); + QLine extenderLine = o->line(PredefinedLine::EXTENDER_LINE); + extenderLine.setP1(extenderLine.p1() + smartTabPosOffset); + p.drawLine(extenderLine.translated(selected.bottomRight())); + + // up / left extender handle + if (isCtrlPressed && selRow0 > 0 && !m_viewer->areCellsSelectedEmpty()) { + QPoint properPoint = o->topRightCorner(selected); + m_upperLevelExtenderRect = o->rect(PredefinedRect::BEGIN_EXTENDER) + .translated(properPoint + smartTabPosOffset); p.setPen(Qt::black); p.setBrush(SmartTabColor); - p.drawRoundRect(m_levelExtenderRect, 30, 75); - QColor color = ((rS1 + 1 - offset) % distance != 0) + p.drawRoundRect(m_upperLevelExtenderRect, xyRadius.x(), xyRadius.y()); + QColor color = ((selRow0 - offset) % distance != 0) ? m_viewer->getLightLineColor() : m_viewer->getMarkerLineColor(); p.setPen(color); - p.drawLine(xS1 - smartTabPosOffset, yS1 + 1, xS1 - 1, yS1 + 1); - - // upper-directional smart tab - if (isCtrlPressed && rS0 > 0 && !m_viewer->areCellsSelectedEmpty()) { - m_upperLevelExtenderRect = QRect(xS1 - smartTabPosOffset, yS0 - 8, 19, 8); - p.setPen(Qt::black); - p.setBrush(SmartTabColor); - p.drawRoundRect(m_upperLevelExtenderRect, 30, 75); - QColor color = ((rS0 - offset) % distance != 0) - ? m_viewer->getLightLineColor() - : m_viewer->getMarkerLineColor(); - p.setPen(color); - p.drawLine(xS1 - smartTabPosOffset, yS0, xS1 - 1, yS0); - } - - p.setBrush(Qt::NoBrush); + p.drawLine(extenderLine.translated(properPoint)); } + + p.setBrush(Qt::NoBrush); } //----------------------------------------------------------------------------- void CellArea::drawSoundCell(QPainter &p, int row, int col) { + const Orientation *o = m_viewer->orientation(); TXshSoundColumn *soundColumn = m_viewer->getXsheet()->getColumn(col)->getSoundColumn(); - int x = m_viewer->columnToX(col); - int y = m_viewer->rowToY(row); - QRect rect = QRect(x + 1, y, ColumnWidth - 1, RowHeight); + QPoint xy = m_viewer->positionToXY(CellPosition(row, col)); + int x = xy.x(); + int y = xy.y(); + if (row == 0) { + if (o->isVerticalTimeline()) + xy.setY(xy.y() + 1); + else + xy.setX(xy.x() + 1); + } + QRect cellRect = o->rect(PredefinedRect::CELL).translated(QPoint(x, y)); + QRect rect = cellRect.adjusted(1, 1, 0, 0); int maxNumFrame = soundColumn->getMaxFrame() + 1; int startFrame = soundColumn->getFirstRow(); TXshCell cell = soundColumn->getCell(row); @@ -1053,88 +1133,81 @@ void CellArea::drawSoundCell(QPainter &p, int row, int col) { m_viewer->getCellTypeAndColors(levelType, cellColor, sideColor, cell, isSelected); - // sfondo celle - QRect backgroundRect = QRect(x + 1, y + 1, ColumnWidth - 1, RowHeight - 1); - p.fillRect(backgroundRect, cellColor); - p.fillRect(QRect(x, y, 7, RowHeight), QBrush(sideColor)); - - // draw dot line if the column is locked - if (soundColumn->isLocked()) { - p.setPen(QPen(cellColor, 2, Qt::DotLine)); - p.drawLine(x + 3, y, x + 3, y + RowHeight); - } - // draw "end of the level" - if (isLastRow) { - QPainterPath path(QPointF(x, y + RowHeight)); - path.lineTo(QPointF(x + 7, y + RowHeight)); - path.lineTo(QPointF(x + 7, y + RowHeight - 7)); - path.lineTo(QPointF(x, y + RowHeight)); - p.fillPath(path, QBrush(cellColor)); - } - - int x1 = rect.x() + 6; - int x2 = rect.x() + rect.width(); - int x1Bis = x2 - 7; - - int offset = row - cell.getFrameId().getNumber(); - int y0 = rect.y(); - int y1 = rect.bottomLeft().y(); - int soundY0 = y0 - m_viewer->rowToY(offset); + // cells background + p.fillRect(rect, QBrush(cellColor)); - int trackWidth = (x1Bis - x1) / 2; + drawDragHandle(p, xy, sideColor); + drawEndOfDragHandle(p, isLastRow, xy, cellColor); + drawLockedDottedLine(p, soundColumn->isLocked(), xy, cellColor); + + QRect trackRect = o->rect(PredefinedRect::SOUND_TRACK).translated(xy); + QRect previewRect = o->rect(PredefinedRect::PREVIEW_TRACK).translated(xy); + NumberRange trackBounds = o->layerSide(trackRect); + NumberRange previewBounds = o->layerSide(previewRect); + NumberRange trackAndPreview(trackBounds.from(), previewBounds.to()); + + NumberRange timeBounds = o->frameSide(trackRect); + int offset = + row - cell.getFrameId().getNumber(); // rows since start of the clip + int begin = timeBounds.from(); // time axis + int end = timeBounds.to(); + int soundPixel = + begin - m_viewer->rowToFrameAxis(offset); // pixels since start of clip + + int trackWidth = trackBounds.length(); int lastMin, lastMax; DoublePair minmax; - soundLevel->getValueAtPixel(soundY0, minmax); + soundLevel->getValueAtPixel(o, soundPixel, minmax); - double pmin = minmax.first + trackWidth / 2.; - double pmax = minmax.second + trackWidth / 2.; + double pmin = minmax.first; + double pmax = minmax.second; - int delta = x1 + trackWidth / 2; - lastMin = tcrop((int)pmin, 0, trackWidth / 2) + delta; - lastMax = tcrop((int)pmax, trackWidth / 2, trackWidth - 1) + delta; + int center = trackBounds.middle(); + lastMin = tcrop((int)pmin, -trackWidth / 2, 0) + center; + lastMax = tcrop((int)pmax, 0, trackWidth / 2 - 1) + center; bool scrub = m_viewer->isScrubHighlighted(row, col); int i; - for (i = y0; i <= y1; i++) { - DoublePair minmax; - soundLevel->getValueAtPixel(soundY0, minmax); - soundY0++; + for (i = begin; i <= end; i++) { + soundLevel->getValueAtPixel(o, soundPixel, minmax); + soundPixel++; int min, max; - double pmin = minmax.first + trackWidth / 2.; - double pmax = minmax.second + trackWidth / 2.; + pmin = minmax.first; + pmax = minmax.second; - int delta = x1 + trackWidth / 2; - min = tcrop((int)pmin, 0, trackWidth / 2) + delta; - max = tcrop((int)pmax, trackWidth / 2, trackWidth - 1) + delta; - - if (i != y0 || !isFirstRow) { - // trattini a destra della colonna - if (i % 2) { - p.setPen(cellColor); - p.drawLine(x1, i, x1Bis, i); - } else { - p.setPen(m_viewer->getSoundColumnTrackColor()); - p.drawLine(x1Bis + 1, i, x2, i); - } - } + center = trackBounds.middle(); + min = tcrop((int)pmin, -trackWidth / 2, 0) + center; + max = tcrop((int)pmax, 0, trackWidth / 2 - 1) + center; if (scrub && i % 2) { p.setPen(m_viewer->getSoundColumnHlColor()); - p.drawLine(x1Bis + 1, i, x2, i); + QLine stroke = o->horizontalLine(i, previewBounds.adjusted(-1, -1)); + p.drawLine(stroke); + } else if (i != begin || !isFirstRow) { + // preview tool on the right side + if (i % 2) + p.setPen(cellColor); + else + p.setPen(m_viewer->getSoundColumnTrackColor()); + QLine stroke = o->horizontalLine(i, previewBounds.adjusted(-1, -1)); + p.drawLine(stroke); } - if (i != y0) { - // "traccia audio" al centro della colonna + if (i != begin) { + // "audio track" in the middle of the column p.setPen(m_viewer->getSoundColumnTrackColor()); - p.drawLine(lastMin, i, min, i); - p.drawLine(lastMax, i, max, i); + QLine minLine = o->horizontalLine(i, NumberRange(lastMin, min)); + p.drawLine(minLine); + QLine maxLine = o->horizontalLine(i, NumberRange(lastMax, max)); + p.drawLine(maxLine); } lastMin = min; lastMax = max; } + // yellow clipped border p.setPen(SoundColumnExtenderColor); int r0WithoutOff, r1WithoutOff; bool ret = @@ -1142,26 +1215,58 @@ void CellArea::drawSoundCell(QPainter &p, int row, int col) { assert(ret); if (isFirstRow) { - if (r0 != r0WithoutOff) { - p.drawLine(x1, y0 + 1, x2, y0 + 1); - p.drawLine(x1, y0 + 2, x2, y0 + 2); - } - QRect modifierRect(x1, y0 + 1, XsheetGUI::ColumnWidth, 2); - m_soundLevelModifyRects.append(modifierRect); + QRect modifierRect = m_viewer->orientation() + ->rect(PredefinedRect::BEGIN_SOUND_EDIT) + .translated(xy); + if (r0 != r0WithoutOff) p.fillRect(modifierRect, SoundColumnExtenderColor); + m_soundLevelModifyRects.append(modifierRect); // list of clipping rects } if (isLastRow) { - if (r1 != r1WithoutOff) { - p.drawLine(x, y1, x2, y1); - p.drawLine(x, y1 - 1, x2, y1 - 1); - } - QRect modifierRect(x1, y1 - 1, XsheetGUI::ColumnWidth, 2); + QRect modifierRect = m_viewer->orientation() + ->rect(PredefinedRect::END_SOUND_EDIT) + .translated(xy); + if (r1 != r1WithoutOff) p.fillRect(modifierRect, SoundColumnExtenderColor); m_soundLevelModifyRects.append(modifierRect); } } //----------------------------------------------------------------------------- +// paint side bar +void CellArea::drawDragHandle(QPainter &p, const QPoint &xy, + const QColor &sideColor) const { + QRect dragHandleRect = m_viewer->orientation() + ->rect(PredefinedRect::DRAG_HANDLE_CORNER) + .translated(xy); + p.fillRect(dragHandleRect, QBrush(sideColor)); +} + +// cut off triangle at the end of drag handle +void CellArea::drawEndOfDragHandle(QPainter &p, bool isEnd, const QPoint &xy, + const QColor &cellColor) const { + if (!isEnd) return; + QPainterPath corner = m_viewer->orientation() + ->path(PredefinedPath::DRAG_HANDLE_CORNER) + .translated(xy); + p.fillPath(corner, QBrush(cellColor)); +} + +// draw dot line if the column is locked +void CellArea::drawLockedDottedLine(QPainter &p, bool isLocked, + const QPoint &xy, + const QColor &cellColor) const { + if (!isLocked) return; + p.setPen(QPen(cellColor, 2, Qt::DotLine)); + QLine dottedLine = + m_viewer->orientation()->line(PredefinedLine::LOCKED).translated(xy); + p.drawLine(dottedLine); +} + +//----------------------------------------------------------------------------- + void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { + const Orientation *o = m_viewer->orientation(); + TXsheet *xsh = m_viewer->getXsheet(); TXshCell cell = xsh->getCell(row, col); TXshCell prevCell; @@ -1171,16 +1276,25 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { bool isSelected = cellSelection->isCellSelected(row, col) || columnSelection->isColumnSelected(col); - if (row > 0) prevCell = xsh->getCell(row - 1, col); + if (row > 0) prevCell = xsh->getCell(row - 1, col); // cell in previous frame // nothing to draw if (cell.isEmpty() && prevCell.isEmpty()) return; TXshCell nextCell; - nextCell = xsh->getCell(row + 1, col); - - int x = m_viewer->columnToX(col); - int y = m_viewer->rowToY(row); - QRect rect = QRect(x + 1, y + 1, ColumnWidth - 1, RowHeight - 1); - if (cell.isEmpty()) { // vuol dire che la precedente non e' vuota + nextCell = xsh->getCell(row + 1, col); // cell in next frame + + QPoint xy = m_viewer->positionToXY(CellPosition(row, col)); + int x = xy.x(); + int y = xy.y(); + if (row == 0) { + if (o->isVerticalTimeline()) + xy.setY(xy.y() + 1); + else + xy.setX(xy.x() + 1); + } + QRect cellRect = o->rect(PredefinedRect::CELL).translated(QPoint(x, y)); + QRect rect = cellRect.adjusted(1, 1, 0, 0); + if (cell.isEmpty()) { // it means previous is not empty + // diagonal cross meaning end of level QColor levelEndColor = m_viewer->getTextColor(); levelEndColor.setAlphaF(0.3); p.setPen(levelEndColor); @@ -1212,51 +1326,49 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { // paint cell p.fillRect(rect, QBrush(cellColor)); - // paint side bar - p.fillRect(QRect(x, y, 7, RowHeight), QBrush(sideColor)); - - if (yetToCleanupCell) - p.fillRect( - rect.adjusted(rect.width() / 2, 0, 0, 0), - (isSelected) ? SelectedFullcolorColumnColor : FullcolorColumnColor); - - // draw dot line if the column is locked - TXshColumn *column = xsh->getColumn(col); - if (column->isLocked()) { - p.setPen(QPen(cellColor, 2, Qt::DotLine)); - p.drawLine(x + 3, y, x + 3, y + RowHeight); - } - // draw "end of the level" - if (nextCell.isEmpty() || - cell.m_level.getPointer() != nextCell.m_level.getPointer()) { - QPainterPath path(QPointF(x, y + RowHeight)); - path.lineTo(QPointF(x + 7, y + RowHeight)); - path.lineTo(QPointF(x + 7, y + RowHeight - 7)); - path.lineTo(QPointF(x, y + RowHeight)); - p.fillPath(path, QBrush(cellColor)); + + drawDragHandle(p, xy, sideColor); + + if (yetToCleanupCell) // ORIENTATION: what's this? + { + if (o->isVerticalTimeline()) + p.fillRect( + rect.adjusted(rect.width() / 2, 0, 0, 0), + (isSelected) ? SelectedFullcolorColumnColor : FullcolorColumnColor); + else + p.fillRect( + rect.adjusted(0, rect.height() / 2, 0, 0), + (isSelected) ? SelectedFullcolorColumnColor : FullcolorColumnColor); } + bool isLastRow = nextCell.isEmpty() || + cell.m_level.getPointer() != nextCell.m_level.getPointer(); + drawEndOfDragHandle(p, isLastRow, xy, cellColor); + + drawLockedDottedLine(p, xsh->getColumn(col)->isLocked(), xy, cellColor); + bool sameLevel = prevCell.m_level.getPointer() == cell.m_level.getPointer(); int distance, offset; TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( distance, offset); - if (distance == 0) distance = 6; - bool isAfterMarkers = (row - offset) % distance == 0; + bool isAfterMarkers = + (row - offset) % distance == 0 && distance != 0 && row != 0; // draw marker interval if (isAfterMarkers) { p.setPen(m_viewer->getMarkerLineColor()); - p.drawLine(x, y, x + 6, y); + p.drawLine(o->line(PredefinedLine::SEE_MARKER_THROUGH).translated(xy)); } - QRect nameRect = rect.adjusted(7, 4, -6, 0); + QRect nameRect = o->rect(PredefinedRect::CELL_NAME).translated(QPoint(x, y)); if (Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled()) { TStageObject *pegbar = xsh->getStageObject(m_viewer->getObjectId(col)); int r0, r1; if (pegbar && pegbar->getKeyframeRange(r0, r1)) - nameRect.adjust(0, 0, -9, 0); + nameRect = o->rect(PredefinedRect::CELL_NAME_WITH_KEYFRAME) + .translated(QPoint(x, y)); } // draw text in red if the file does not exist @@ -1280,16 +1392,17 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { // do not draw frame number under RenameCellField if (m_renameCell->isVisible() && m_renameCell->isLocatedAt(row, col)) return; - // if the same level & same fId with the previous cell, then draw vertical - // line - if (sameLevel && prevCell.m_frameId == cell.m_frameId) { // cella uguale a - // quella precedente - // (non sulla marker - // line): - int x = (Preferences::instance()->isLevelNameOnEachMarkerEnabled()) - ? rect.right() - 11 - : rect.center().x(); - p.drawLine(x, rect.top(), x, rect.bottom()); + // if the same level & same fId with the previous cell, + // draw continue line + if (sameLevel && prevCell.m_frameId == cell.m_frameId) { + // not on line marker + PredefinedLine which = + Preferences::instance()->isLevelNameOnEachMarkerEnabled() + ? PredefinedLine::CONTINUE_LEVEL_WITH_NAME + : PredefinedLine::CONTINUE_LEVEL; + + QLine continueLine = o->line(which).translated(xy); + p.drawLine(continueLine); } // draw frame number else { @@ -1298,7 +1411,7 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { // convert the last one digit of the frame number to alphabet // Ex. 12 -> 1B 21 -> 2A 30 -> 3 if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) - p.drawText(nameRect, Qt::AlignRight, + p.drawText(nameRect, Qt::AlignRight | Qt::AlignBottom, m_viewer->getFrameNumberWithLetters(fid.getNumber())); else { std::string frameNumber(""); @@ -1306,7 +1419,8 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { if (fid.getNumber() > 0) frameNumber = std::to_string(fid.getNumber()); // add letter if (fid.getLetter() != 0) frameNumber.append(1, fid.getLetter()); - p.drawText(nameRect, Qt::AlignRight, QString::fromStdString(frameNumber)); + p.drawText(nameRect, Qt::AlignRight | Qt::AlignBottom, + QString::fromStdString(frameNumber)); } } @@ -1322,26 +1436,44 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { #else QString elidaName = elideText(text, font, nameRect.width()); #endif - p.drawText(nameRect, Qt::AlignLeft, elidaName); + p.drawText(nameRect, Qt::AlignLeft | Qt::AlignBottom, elidaName); } } //----------------------------------------------------------------------------- void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { - TXsheet *xsh = m_viewer->getXsheet(); - TXshCell cell = xsh->getCell(row, col); + const Orientation *o = m_viewer->orientation(); + TXsheet *xsh = m_viewer->getXsheet(); + TXshCell cell = xsh->getCell(row, col); TXshCell prevCell; - if (row > 0) prevCell = xsh->getCell(row - 1, col); + + TCellSelection *cellSelection = m_viewer->getCellSelection(); + TColumnSelection *columnSelection = m_viewer->getColumnSelection(); + bool isSelected = cellSelection->isCellSelected(row, col) || + columnSelection->isColumnSelected(col); + + if (row > 0) prevCell = xsh->getCell(row - 1, col); // cell in previous frame + // nothing to draw + if (cell.isEmpty() && prevCell.isEmpty()) return; TXshCell nextCell; nextCell = xsh->getCell(row + 1, col); - if (cell.isEmpty() && prevCell.isEmpty()) return; - int x = m_viewer->columnToX(col); - int y = m_viewer->rowToY(row); - QRect rect = QRect(x + 1, y + 1, ColumnWidth - 1, RowHeight - 1); - if (cell.isEmpty()) { // vuol dire che la precedente non e' vuota - p.setPen(m_viewer->getLightLineColor()); + QPoint xy = m_viewer->positionToXY(CellPosition(row, col)); + int x = xy.x(); + int y = xy.y(); + if (row == 0) { + if (o->isVerticalTimeline()) + xy.setY(xy.y() + 1); + else + xy.setX(xy.x() + 1); + } + QRect cellRect = o->rect(PredefinedRect::CELL).translated(QPoint(x, y)); + QRect rect = cellRect.adjusted(1, 1, 0, 0); + if (cell.isEmpty()) { // diagonal cross meaning end of level + QColor levelEndColor = m_viewer->getTextColor(); + levelEndColor.setAlphaF(0.3); + p.setPen(levelEndColor); p.drawLine(rect.topLeft(), rect.bottomRight()); p.drawLine(rect.topRight(), rect.bottomLeft()); return; @@ -1349,35 +1481,36 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { int levelType; QColor cellColor, sideColor; - m_viewer->getCellTypeAndColors(levelType, cellColor, sideColor, cell); + m_viewer->getCellTypeAndColors(levelType, cellColor, sideColor, cell, + isSelected); + + // paint cell p.fillRect(rect, QBrush(cellColor)); - if (nextCell.isEmpty() || - cell.m_level.getPointer() != nextCell.m_level.getPointer()) { - QPainterPath path(QPointF(x, y)); - path.lineTo(QPointF(x + 6, y)); - path.lineTo(QPointF(x + 6, y + 2)); - path.lineTo(QPointF(x, y + RowHeight - 2)); - p.fillPath(path, QBrush(sideColor)); - } else - p.fillRect(QRect(x, y, 6, RowHeight), QBrush(sideColor)); + drawDragHandle(p, xy, sideColor); + + bool isLastRow = nextCell.isEmpty() || + cell.m_level.getPointer() != nextCell.m_level.getPointer(); + drawEndOfDragHandle(p, isLastRow, xy, cellColor); + drawLockedDottedLine(p, xsh->getColumn(col)->isLocked(), xy, cellColor); bool sameLevel = prevCell.m_level.getPointer() == cell.m_level.getPointer(); - TFrameId fid = cell.m_frameId; - if (sameLevel && - prevCell.m_frameId == fid) { // cella uguale a quella precedente - // non scrivo nulla e disegno una linea verticale - QPen oldPen = p.pen(); - p.setPen(QPen(Qt::black, 1, Qt::DotLine)); - int x = rect.center().x(); - p.drawLine(x, rect.top(), x, rect.bottom()); - p.setPen(oldPen); - return; + int distance, offset; + TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( + distance, offset); + bool isAfterMarkers = + (row - offset) % distance == 0 && distance != 0 && row != 0; + + // draw marker interval + if (isAfterMarkers) { + p.setPen(m_viewer->getMarkerLineColor()); + p.drawLine(o->line(PredefinedLine::SEE_MARKER_THROUGH).translated(xy)); } - QString text = cell.getSoundTextLevel()->getFrameText(fid.getNumber() - 1); + p.setPen(Qt::black); - QRect nameRect = rect.adjusted(8, -H_ADJUST, -10, H_ADJUST); + QRect nameRect = o->rect(PredefinedRect::CELL_NAME).translated(QPoint(x, y)); + // il nome va scritto se e' diverso dalla cella precedente oppure se // siamo su una marker line #ifdef _WIN32 @@ -1388,6 +1521,21 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { font.setPixelSize(XSHEET_FONT_PX_SIZE); p.setFont(font); + // if the same level & same fId with the previous cell, + // draw continue line + if (sameLevel && prevCell.m_frameId == cell.m_frameId) { + // not on line marker + PredefinedLine which = + Preferences::instance()->isLevelNameOnEachMarkerEnabled() + ? PredefinedLine::CONTINUE_LEVEL_WITH_NAME + : PredefinedLine::CONTINUE_LEVEL; + QLine continueLine = o->line(which).translated(xy); + p.drawLine(continueLine); + } + + QString text = + cell.getSoundTextLevel()->getFrameText(cell.m_frameId.getNumber() - 1); + #if QT_VERSION >= 0x050500 QFontMetrics metric(font); QString elidaName = elideText(text, metric, nameRect.width(), "~"); @@ -1395,14 +1543,16 @@ void CellArea::drawSoundTextCell(QPainter &p, int row, int col) { QString elidaName = elideText(text, font, nameRect.width(), "~"); #endif - if (!sameLevel || prevCell.m_frameId != fid) - p.drawText(nameRect, Qt::AlignLeft, elidaName); + if (!sameLevel || prevCell.m_frameId != cell.m_frameId) + p.drawText(nameRect, Qt::AlignLeft | Qt::AlignBottom, elidaName); } //----------------------------------------------------------------------------- void CellArea::drawPaletteCell(QPainter &p, int row, int col, bool isReference) { + const Orientation *o = m_viewer->orientation(); + TXsheet *xsh = m_viewer->getXsheet(); TXshCell cell = xsh->getCell(row, col); TXshCell prevCell; @@ -1414,10 +1564,18 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, TXshCell nextCell = xsh->getCell(row + 1, col); if (cell.isEmpty() && prevCell.isEmpty()) return; - int x = m_viewer->columnToX(col); - int y = m_viewer->rowToY(row); - QRect rect = QRect(x + 1, y + 1, ColumnWidth - 1, RowHeight - 1); - if (cell.isEmpty()) { // vuol dire che la precedente non e' vuota + QPoint xy = m_viewer->positionToXY(CellPosition(row, col)); + int x = xy.x(); + int y = xy.y(); + if (row == 0) { + if (o->isVerticalTimeline()) + xy.setY(xy.y() + 1); + else + xy.setX(xy.x() + 1); + } + QRect cellRect = o->rect(PredefinedRect::CELL).translated(QPoint(x, y)); + QRect rect = cellRect.adjusted(1, 1, 0, 0); + if (cell.isEmpty()) { // this means the former is not empty QColor levelEndColor = m_viewer->getTextColor(); levelEndColor.setAlphaF(0.3); p.setPen(levelEndColor); @@ -1438,22 +1596,12 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, } p.fillRect(rect, QBrush(cellColor)); - p.fillRect(QRect(x, y, 7, RowHeight), QBrush(sideColor)); - TXshColumn *column = xsh->getColumn(col); - if (column->isLocked()) { - p.setPen(QPen(cellColor, 2, Qt::DotLine)); - p.drawLine(x + 3, y, x + 3, y + RowHeight); - } - - if (nextCell.isEmpty() || - cell.m_level.getPointer() != nextCell.m_level.getPointer()) { - QPainterPath path(QPointF(x, y + RowHeight)); - path.lineTo(QPointF(x + 7, y + RowHeight)); - path.lineTo(QPointF(x + 7, y + RowHeight - 7)); - path.lineTo(QPointF(x, y + RowHeight)); - p.fillPath(path, QBrush(cellColor)); - } + drawDragHandle(p, xy, sideColor); + bool isLastRow = nextCell.isEmpty() || + cell.m_level.getPointer() != nextCell.m_level.getPointer(); + drawEndOfDragHandle(p, isLastRow, xy, cellColor); + drawLockedDottedLine(p, xsh->getColumn(col)->isLocked(), xy, cellColor); bool sameLevel = prevCell.m_level.getPointer() == cell.m_level.getPointer(); @@ -1461,21 +1609,20 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, TApp::instance()->getCurrentScene()->getScene()->getProperties()->getMarkers( distance, offset); if (distance == 0) distance = 6; - bool isAfterMarkers = (row - offset) % distance == 0; + bool isAfterMarkers = (row - offset) % distance == 0 && row != 0; if (isAfterMarkers) { p.setPen(m_viewer->getMarkerLineColor()); - p.drawLine(x, y, x + 6, y); + p.drawLine(o->line(PredefinedLine::SEE_MARKER_THROUGH).translated(xy)); } if (sameLevel && prevCell.m_frameId == cell.m_frameId && - !isAfterMarkers) { // cella uguale a quella precedente (non sulla marker - // line): - // non scrivo nulla e disegno una linea verticale + !isAfterMarkers) { // cell equal to previous one (not on marker line): + // do not write anything and draw a vertical line QPen oldPen = p.pen(); p.setPen(QPen(m_viewer->getTextColor(), 1)); - int x = rect.center().x(); - p.drawLine(x, rect.top(), x, rect.bottom()); + QLine continueLine = o->line(PredefinedLine::CONTINUE_LEVEL).translated(xy); + p.drawLine(continueLine); p.setPen(oldPen); } else { TFrameId fid = cell.m_frameId; @@ -1485,7 +1632,16 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, if (fid.getNumber() > 0) frameNumber = std::to_string(fid.getNumber()); if (fid.getLetter() != 0) frameNumber.append(1, fid.getLetter()); - QRect nameRect = rect.adjusted(7, 4, -12, 0); + QRect nameRect = + o->rect(PredefinedRect::CELL_NAME).translated(QPoint(x, y)); + + if (Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled()) { + TStageObject *pegbar = xsh->getStageObject(m_viewer->getObjectId(col)); + int r0, r1; + if (pegbar && pegbar->getKeyframeRange(r0, r1)) + nameRect = o->rect(PredefinedRect::CELL_NAME_WITH_KEYFRAME) + .translated(QPoint(x, y)); + } bool isRed = false; TXshPaletteLevel *pl = cell.getPaletteLevel(); @@ -1507,8 +1663,20 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, // e' diverso dal precedente QString numberStr; if (!sameLevel || prevCell.m_frameId != cell.m_frameId) { - numberStr = QString::fromStdString(frameNumber); - p.drawText(nameRect, Qt::AlignRight, numberStr); + // convert the last one digit of the frame number to alphabet + // Ex. 12 -> 1B 21 -> 2A 30 -> 3 + if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) { + numberStr = m_viewer->getFrameNumberWithLetters(fid.getNumber()); + p.drawText(nameRect, Qt::AlignRight | Qt::AlignBottom, numberStr); + } else { + std::string frameNumber(""); + // set number + if (fid.getNumber() > 0) frameNumber = std::to_string(fid.getNumber()); + // add letter + if (fid.getLetter() != 0) frameNumber.append(1, fid.getLetter()); + numberStr = QString::fromStdString(frameNumber); + p.drawText(nameRect, Qt::AlignRight | Qt::AlignBottom, numberStr); + } } QString text = QString::fromStdWString(levelName); @@ -1521,34 +1689,39 @@ void CellArea::drawPaletteCell(QPainter &p, int row, int col, #endif if (!sameLevel || isAfterMarkers) - p.drawText(nameRect, Qt::AlignLeft, elidaName); + p.drawText(nameRect, Qt::AlignLeft | Qt::AlignBottom, elidaName); } } //----------------------------------------------------------------------------- void CellArea::drawKeyframe(QPainter &p, const QRect toBeUpdated) { + const Orientation *o = m_viewer->orientation(); int r0, r1, c0, c1; // range of visible rows and columns - r0 = m_viewer->yToRow(toBeUpdated.top()); - r1 = m_viewer->yToRow(toBeUpdated.bottom()); - c0 = m_viewer->xToColumn(toBeUpdated.left()); - c1 = m_viewer->xToColumn(toBeUpdated.right()); + CellRange visible = m_viewer->xyRectToRange(toBeUpdated); + r0 = visible.from().frame(); + r1 = visible.to().frame(); + c0 = visible.from().layer(); + c1 = visible.to().layer(); static QPixmap selectedKey = QPixmap(":Resources/selected_key.bmp"); static QPixmap key = QPixmap(":Resources/key.bmp"); - int keyPixOffset = (RowHeight - key.height()) / 2; + const QRect &keyRect = o->rect(PredefinedRect::KEY_ICON); TXsheet *xsh = m_viewer->getXsheet(); - ColumnFan *columnFan = xsh->getColumnFan(); + ColumnFan *columnFan = xsh->getColumnFan(o); int col; for (col = c0; col <= c1; col++) { if (!columnFan->isActive(col)) continue; - int x = m_viewer->columnToX(col); + int layerAxis = m_viewer->columnToLayerAxis(col); + TStageObject *pegbar = xsh->getStageObject(m_viewer->getObjectId(col)); if (!pegbar) return; + int row0, row1; bool emptyKeyframe = !pegbar->getKeyframeRange(row0, row1); if (emptyKeyframe) continue; + bool emptyKeyframeRange = row0 >= row1; int row; row0 = std::max(row0, r0); @@ -1556,98 +1729,120 @@ void CellArea::drawKeyframe(QPainter &p, const QRect toBeUpdated) { /*- first, draw key segments -*/ p.setPen(m_viewer->getTextColor()); - int x_line = x + ColumnWidth - 8; + int line_layerAxis = layerAxis + o->layerSide(keyRect).middle(); for (row = row0; row <= row1; row++) { - int hr0, hr1; - double e0, e1; - if (pegbar->getKeyframeSpan(row, hr0, e0, hr1, e1)) { - int y0 = m_viewer->rowToY(hr0 + 1) - keyPixOffset; - int y1 = m_viewer->rowToY(hr1) + keyPixOffset; - p.drawLine(x_line, y0, x_line, y1); - if (hr1 - hr0 > 4) { - int rh0, rh1; - if (getEaseHandles(hr0, hr1, e0, e1, rh0, rh1)) { - int e0Y = m_viewer->rowToY(rh0) + keyPixOffset; - drawArrow(p, QPointF(x_line - 4, e0Y + 2), - QPointF(x_line + 4, e0Y + 2), QPointF(x_line, e0Y + 6), - true, m_viewer->getLightLineColor(), - m_viewer->getTextColor()); - int e1Y = m_viewer->rowToY(rh1 + 1) - keyPixOffset; - drawArrow(p, QPointF(x_line - 4, e1Y - 2), - QPointF(x_line + 4, e1Y - 2), QPointF(x_line, e1Y - 6), - true, m_viewer->getLightLineColor(), - m_viewer->getTextColor()); + int segmentRow0, segmentRow1; + double ease0, ease1; + if (pegbar->getKeyframeSpan(row, segmentRow0, ease0, segmentRow1, + ease1)) { + drawKeyframeLine(p, col, NumberRange(segmentRow0, segmentRow1)); + + if (segmentRow1 - segmentRow0 > + 4) { // only show if distance more than 4 frames + int handleRow0, handleRow1; + if (getEaseHandles(segmentRow0, segmentRow1, ease0, ease1, handleRow0, + handleRow1)) { + m_viewer->drawPredefinedPath(p, PredefinedPath::BEGIN_EASE_TRIANGLE, + CellPosition(handleRow0, col), + m_viewer->getLightLineColor(), + m_viewer->getTextColor()); + + m_viewer->drawPredefinedPath(p, PredefinedPath::END_EASE_TRIANGLE, + CellPosition(handleRow1, col), + m_viewer->getLightLineColor(), + m_viewer->getTextColor()); } } - // jump to next segment - row = hr1 - 1; + // skip to next segment + row = segmentRow1 - 1; } else if (pegbar->isKeyframe(row) && pegbar->isKeyframe(row + 1)) { - int y0 = m_viewer->rowToY(row + 1); - p.drawLine(x_line, y0 - keyPixOffset, x_line, y0 + keyPixOffset); + // 2 keyframes in a row - connect with a short line + drawKeyframeLine(p, col, NumberRange(row, row + 1)); } } /*- then draw keyframe pixmaps -*/ - int x1 = x + ColumnWidth - 13; + int icon_layerAxis = line_layerAxis - 5; for (row = row0; row <= row1; row++) { - int y = m_viewer->rowToY(row) + 1; p.setPen(m_viewer->getTextColor()); if (pegbar->isKeyframe(row)) { + QPoint target = + keyRect.translated(m_viewer->positionToXY(CellPosition(row, col))) + .topLeft(); if (m_viewer->getKeyframeSelection() && m_viewer->getKeyframeSelection()->isSelected(row, col)) { - // keyframe selezionato - p.drawPixmap(x1, y + keyPixOffset, selectedKey); + // keyframe selected + p.drawPixmap(target, selectedKey); } else { - // keyframe non selezionato - p.drawPixmap(x1, y + keyPixOffset, key); + // keyframe not selected + p.drawPixmap(target, key); } } } - int y1 = m_viewer->rowToY(row1 + 1); + int icon_frameAxis = m_viewer->rowToFrameAxis(row1 + 1); if (!emptyKeyframeRange && row0 <= row1 + 1) { - // c'e' piu' di un keyframe - // disegno il bottone per il ciclo + // there's just a keyframe + // drawing loop button p.setBrush(Qt::white); p.setPen(Qt::black); - p.drawRect(x1, y1, 10, 10); + QPoint target = o->frameLayerToXY(icon_frameAxis, icon_layerAxis); + p.drawRect(QRect(target, QSize(10, 10))); p.setBrush(Qt::NoBrush); - // disegno il bordo in basso (arrotondato) - p.drawLine(x1 + 1, y1 + 10, x1 + 9, y1 + 10); + // drawing the bottom edge (rounded) + p.drawLine(target + QPoint(1, 10), target + QPoint(9, 10)); p.setPen(Qt::white); - p.drawLine(x1 + 3, y1 + 10, x1 + 7, y1 + 10); + p.drawLine(target + QPoint(3, 10), target + QPoint(7, 10)); p.setPen(Qt::black); - p.drawLine(x1 + 3, y1 + 11, x1 + 7, y1 + 11); + p.drawLine(target + QPoint(3, 11), target + QPoint(7, 11)); - // disegno la freccia - p.drawArc(QRect(x1 + 2, y1 + 3, 6, 6), 180 * 16, 270 * 16); - p.drawLine(x1 + 5, y1 + 2, x1 + 5, y1 + 5); - p.drawLine(x1 + 5, y1 + 2, x1 + 8, y1 + 2); + // drawing the arrow + p.drawArc(QRect(target + QPoint(2, 3), QSize(6, 6)), 180 * 16, 270 * 16); + p.drawLine(target + QPoint(5, 2), target + QPoint(5, 5)); + p.drawLine(target + QPoint(5, 2), target + QPoint(8, 2)); } if (pegbar->isCycleEnabled()) { - // la riga a zigzag sotto il bottone - int ymax = m_viewer->rowToY(r1 + 1); - int qy = y1 + 12; + // the row zigzag bellow the button + int ymax = m_viewer->rowToFrameAxis(r1 + 1); + int qy = icon_frameAxis + 12; int zig = 2; - int qx = x1 + 5; + int qx = icon_layerAxis + 5; p.setPen(m_viewer->getTextColor()); - p.drawLine(qx, qy, qx - zig, qy + zig); + p.drawLine(o->frameLayerToXY(qy, qx), + o->frameLayerToXY(qy + zig, qx - zig)); while (qy < ymax) { - p.drawLine(qx - zig, qy + zig, qx + zig, qy + 3 * zig); - p.drawLine(qx + zig, qy + 3 * zig, qx - zig, qy + 5 * zig); + p.drawLine(o->frameLayerToXY(qy + zig, qx - zig), + o->frameLayerToXY(qy + 3 * zig, qx + zig)); + p.drawLine(o->frameLayerToXY(qy + 3 * zig, qx + zig), + o->frameLayerToXY(qy + 5 * zig, qx - zig)); qy += 4 * zig; } } } } + +void CellArea::drawKeyframeLine(QPainter &p, int col, + const NumberRange &rows) const { + const QRect &keyRect = + m_viewer->orientation()->rect(PredefinedRect::KEY_ICON); + QPoint begin = + keyRect.center() + m_viewer->positionToXY(CellPosition(rows.from(), col)); + QPoint end = + keyRect.center() + m_viewer->positionToXY(CellPosition(rows.to(), col)); + + p.setPen(m_viewer->getTextColor()); + p.drawLine(QLine(begin, end)); +} + //----------------------------------------------------------------------------- void CellArea::drawNotes(QPainter &p, const QRect toBeUpdated) { + CellRange visible = m_viewer->xyRectToRange(toBeUpdated); int r0, r1, c0, c1; // range of visible rows and columns - r0 = m_viewer->yToRow(toBeUpdated.top()); - r1 = m_viewer->yToRow(toBeUpdated.bottom()); - c0 = m_viewer->xToColumn(toBeUpdated.left()); - c1 = m_viewer->xToColumn(toBeUpdated.right()); + r0 = visible.from().frame(); + r1 = visible.to().frame(); + c0 = visible.from().layer(); + c1 = visible.to().layer(); TXsheet *xsh = m_viewer->getXsheet(); if (!xsh) return; @@ -1668,8 +1863,8 @@ void CellArea::drawNotes(QPainter &p, const QRect toBeUpdated) { int r = notes->getNoteRow(i); int c = notes->getNoteCol(i); if (r < r0 || r > r1 || c < c0 || c > c1) continue; - TPointD pos = notes->getNotePos(i) + - TPointD(m_viewer->columnToX(c), m_viewer->rowToY(r)); + QPoint xy = m_viewer->positionToXY(CellPosition(r, c)); + TPointD pos = notes->getNotePos(i) + TPointD(xy.x(), xy.y()); noteWidget->paint(&p, QPoint(pos.x, pos.y), i == m_viewer->getCurrentNoteIndex()); } @@ -1679,7 +1874,7 @@ void CellArea::drawNotes(QPainter &p, const QRect toBeUpdated) { bool CellArea::getEaseHandles(int r0, int r1, double e0, double e1, int &rh0, int &rh1) { - if (r1 <= r0 + 4) { + if (r1 <= r0 + 4) { // ... what? rh0 = r0; rh1 = r1; return false; @@ -1726,6 +1921,7 @@ void CellArea::paintEvent(QPaintEvent *event) { QPainter p(this); p.setClipRect(toBeUpdated); + p.fillRect(toBeUpdated, QBrush(m_viewer->getEmptyCellColor())); drawCells(p, toBeUpdated); @@ -1735,11 +1931,14 @@ void CellArea::paintEvent(QPaintEvent *event) { if (getDragTool()) getDragTool()->drawCellsArea(p); + // focus cell border int row = m_viewer->getCurrentRow(); int col = m_viewer->getCurrentColumn(); - int x = m_viewer->columnToX(col); - int y = m_viewer->rowToY(row); - QRect rect = QRect(x + 1, y + 1, ColumnWidth - 2, RowHeight - 2); + QPoint xy = m_viewer->positionToXY(CellPosition(row, col)); + QRect rect = m_viewer->orientation() + ->rect(PredefinedRect::CELL) + .translated(xy) + .adjusted(1, 1, -1, -1); p.setPen(Qt::black); p.setBrush(Qt::NoBrush); p.drawRect(rect); @@ -1771,6 +1970,8 @@ public: //---------------------------------------------------------- void CellArea::mousePressEvent(QMouseEvent *event) { + const Orientation *o = m_viewer->orientation(); + m_viewer->setQtModifiers(event->modifiers()); assert(!m_isPanning); m_isMousePressed = true; @@ -1778,20 +1979,21 @@ void CellArea::mousePressEvent(QMouseEvent *event) { assert(getDragTool() == 0); TPoint pos(event->pos().x(), event->pos().y()); - int row = m_viewer->yToRow(pos.y); - int col = m_viewer->xToColumn(pos.x); - int x0 = m_viewer->columnToX(col); - int y1 = m_viewer->rowToY(row) - 1; - int x = pos.x - x0; - - // Verifico se ho cliccato su una nota + CellPosition cellPosition = m_viewer->xyToPosition(event->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); + QPoint cellTopLeft = m_viewer->positionToXY(CellPosition(row, col)); + QPoint mouseInCell = event->pos() - cellTopLeft; + int x = mouseInCell.x(); // where in the cell click is + + // Check if a note is clicked TXshNoteSet *notes = m_viewer->getXsheet()->getNotes(); int i; for (i = notes->getCount() - 1; i >= 0; i--) { int r = notes->getNoteRow(i); int c = notes->getNoteCol(i); - TPointD pos = notes->getNotePos(i) + - TPointD(m_viewer->columnToX(c), m_viewer->rowToY(r)); + QPoint xy = m_viewer->positionToXY(CellPosition(r, c)); + TPointD pos = notes->getNotePos(i) + TPointD(xy.x(), xy.y()); QRect rect(pos.x, pos.y, NoteWidth, NoteHeight); if (!rect.contains(event->pos())) continue; setDragTool(XsheetGUI::DragTool::makeNoteMoveTool(m_viewer)); @@ -1801,14 +2003,13 @@ void CellArea::mousePressEvent(QMouseEvent *event) { update(); return; } - // Se non ho cliccato su una nota e c'e' una nota selezionata la - // deseleziono. + // If I have not clicked on a note, and there's a note selected, deselect it if (m_viewer->getCurrentNoteIndex() >= 0) m_viewer->setCurrentNoteIndex(-1); TXsheet *xsh = m_viewer->getXsheet(); TXshColumn *column = xsh->getColumn(col); - // Verifico se e' una colonna sound + // Check if it's the sound column bool isSoundColumn = false; if (column) { TXshSoundColumn *soundColumn = column->getSoundColumn(); @@ -1832,13 +2033,16 @@ void CellArea::mousePressEvent(QMouseEvent *event) { TStageObject *pegbar = xsh->getStageObject(m_viewer->getObjectId(col)); if (Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled()) { + // only if key frame area is active int k0, k1; + bool isKeyframeFrame = pegbar && pegbar->getKeyframeRange(k0, k1) && + (k1 > k0 || k0 == row) && k0 <= row && + row <= k1 + 1; bool isKeyFrameArea = - (pegbar && pegbar->getKeyframeRange(k0, k1) && - (k1 > k0 || k0 == row) && k0 <= row && row <= k1 + 1 && - ColumnWidth - 13 <= x && x <= ColumnWidth) - ? true - : false; + isKeyframeFrame && + o->rect(PredefinedRect::KEYFRAME_AREA).contains(mouseInCell) && + row < k1 + 1; + bool accept = false; if (isKeyFrameArea) { // They are in the keyframe selection if (pegbar->isKeyframe(row)) // in the keyframe @@ -1846,33 +2050,49 @@ void CellArea::mousePressEvent(QMouseEvent *event) { m_viewer->setCurrentRow( row); // If you click on the key, change the current row as well setDragTool(XsheetGUI::DragTool::makeKeyframeMoverTool(m_viewer)); + accept = true; } else { int r0, r1; double e0, e1; int rh0, rh1; if (pegbar->getKeyframeSpan(row, r0, e0, r1, e1) && getEaseHandles(r0, r1, e0, e1, rh0, rh1)) { - if (rh0 == row) // in a keyframe handle + if (rh0 == row) { // in a keyframe handle setDragTool(XsheetGUI::DragTool::makeKeyFrameHandleMoverTool( m_viewer, true, r0)); - else if (rh1 == row) // in a keyframe handle + accept = true; + } else if (rh1 == row) { // in a keyframe handle setDragTool(XsheetGUI::DragTool::makeKeyFrameHandleMoverTool( m_viewer, false, r1)); - } - if (row == k1 + 1) // in the cycle toggle - { - pegbar->enableCycle(!pegbar->isCycleEnabled()); - TUndoManager::manager()->add(new CycleUndo(pegbar, this)); + accept = true; + } } } + } else if (isKeyframeFrame && row == k1 + 1 && + o->rect(PredefinedRect::LOOP_ICON) + .contains(mouseInCell)) { // cycle toggle + pegbar->enableCycle(!pegbar->isCycleEnabled()); + TUndoManager::manager()->add(new CycleUndo(pegbar, this)); + accept = true; + } + if (accept) { m_viewer->dragToolClick(event); event->accept(); update(); return; } + // keep searching } - if ((!xsh->getCell(row, col).isEmpty()) && x < 6) { + if (m_levelExtenderRect.contains(pos.x, pos.y)) { + m_viewer->getKeyframeSelection()->selectNone(); + setDragTool(XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer)); + } else if (event->modifiers() & Qt::ControlModifier && + m_upperLevelExtenderRect.contains(pos.x, pos.y)) { + m_viewer->getKeyframeSelection()->selectNone(); + setDragTool(XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer, true)); + } else if ((!xsh->getCell(row, col).isEmpty()) && + o->rect(PredefinedRect::DRAG_AREA).contains(mouseInCell)) { TXshColumn *column = xsh->getColumn(col); if (column && !m_viewer->getCellSelection()->isCellSelected(row, col)) { int r0, r1; @@ -1897,14 +2117,10 @@ void CellArea::mousePressEvent(QMouseEvent *event) { setDragTool(XsheetGUI::DragTool::makeLevelMoverTool(m_viewer)); } else { m_viewer->getKeyframeSelection()->selectNone(); - if (isSoundColumn && x > ColumnWidth - 6 && x < ColumnWidth) + if (isSoundColumn && + o->rect(PredefinedRect::PREVIEW_TRACK).contains(mouseInCell)) setDragTool(XsheetGUI::DragTool::makeSoundScrubTool( m_viewer, column->getSoundColumn())); - else if (m_levelExtenderRect.contains(pos.x, pos.y)) - setDragTool(XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer)); - else if (event->modifiers() & Qt::ControlModifier && - m_upperLevelExtenderRect.contains(pos.x, pos.y)) - setDragTool(XsheetGUI::DragTool::makeLevelExtenderTool(m_viewer, true)); else if (isSoundColumn && rectContainsPos(m_soundLevelModifyRects, event->pos())) setDragTool(XsheetGUI::DragTool::makeSoundLevelModifierTool(m_viewer)); @@ -1923,6 +2139,8 @@ void CellArea::mousePressEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- void CellArea::mouseMoveEvent(QMouseEvent *event) { + const Orientation *o = m_viewer->orientation(); + m_viewer->setQtModifiers(event->modifiers()); setCursor(Qt::ArrowCursor); QPoint pos = event->pos(); @@ -1945,10 +2163,13 @@ void CellArea::mouseMoveEvent(QMouseEvent *event) { return; } - int row = m_viewer->yToRow(pos.y()); - int col = m_viewer->xToColumn(pos.x()); - int x0 = m_viewer->columnToX(col); - int x = m_pos.x() - x0; + CellPosition cellPosition = m_viewer->xyToPosition(pos); + int row = cellPosition.frame(); + int col = cellPosition.layer(); + QPoint cellTopLeft = m_viewer->positionToXY(CellPosition(row, col)); + int x = m_pos.x() - cellTopLeft.x(); + int y = m_pos.y() - cellTopLeft.y(); + QPoint mouseInCell = m_pos - cellTopLeft; TXsheet *xsh = m_viewer->getXsheet(); @@ -1965,9 +2186,15 @@ void CellArea::mouseMoveEvent(QMouseEvent *event) { TStageObject *pegbar = xsh->getStageObject(m_viewer->getObjectId(col)); int k0, k1; - if (Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled() && - pegbar && pegbar->getKeyframeRange(k0, k1) && k0 <= row && - row <= k1 + 1 && ColumnWidth - 13 <= x && x <= ColumnWidth) { + bool isKeyframeFrame = + Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled() && + pegbar && pegbar->getKeyframeRange(k0, k1) && k0 <= row && row <= k1 + 1; + bool isKeyFrameArea = + isKeyframeFrame && + o->rect(PredefinedRect::KEYFRAME_AREA).contains(mouseInCell) && + row < k1 + 1; + + if (isKeyFrameArea) { if (pegbar->isKeyframe(row)) // key frame m_tooltip = tr("Click to select keyframe, drag to move it"); else { @@ -1983,10 +2210,13 @@ void CellArea::mouseMoveEvent(QMouseEvent *event) { else if (rh1 == row) m_tooltip = tr("Click and drag to set the deceleration range"); } - if (row == k1 + 1) // cycle toggle of key frames - m_tooltip = tr("Set the cycle of previous keyframes"); } - } else if ((!xsh->getCell(row, col).isEmpty() || isSoundColumn) && x < 6) + } else if (isKeyframeFrame && row == k1 + 1 && + o->rect(PredefinedRect::LOOP_ICON) + .contains(mouseInCell)) // cycle toggle of key frames + m_tooltip = tr("Set the cycle of previous keyframes"); + else if ((!xsh->getCell(row, col).isEmpty()) && + o->rect(PredefinedRect::DRAG_AREA).contains(mouseInCell)) m_tooltip = tr("Click and drag to move the selection"); else if (isZeraryColumn) m_tooltip = QString::fromStdWString(column->getZeraryFxColumn() @@ -1994,7 +2224,7 @@ void CellArea::mouseMoveEvent(QMouseEvent *event) { ->getZeraryFx() ->getName()); else if ((!xsh->getCell(row, col).isEmpty() && !isSoundColumn) && x > 6 && - x < ColumnWidth) { + x < o->cellWidth()) { TXshCell cell = xsh->getCell(row, col); TFrameId fid = cell.getFrameId(); std::wstring levelName = cell.m_level->getName(); @@ -2017,12 +2247,16 @@ void CellArea::mouseMoveEvent(QMouseEvent *event) { : QString::fromStdWString(levelName) + QString(" ") + QString::fromStdString(frameNumber)); } - } else if (isSoundColumn && x > ColumnWidth - 6 && x < ColumnWidth) + } else if (isSoundColumn && + o->rect(PredefinedRect::PREVIEW_TRACK).contains(mouseInCell)) m_tooltip = tr("Click and drag to play"); else if (m_levelExtenderRect.contains(pos)) m_tooltip = tr("Click and drag to repeat selected cells"); else if (isSoundColumn && rectContainsPos(m_soundLevelModifyRects, pos)) { - setCursor(Qt::SplitVCursor); + if (o->isVerticalTimeline()) + setCursor(Qt::SplitVCursor); + else + setCursor(Qt::SplitHCursor); m_tooltip = tr(""); } else m_tooltip = tr(""); @@ -2041,9 +2275,11 @@ void CellArea::mouseReleaseEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- void CellArea::mouseDoubleClickEvent(QMouseEvent *event) { + const Orientation *o = m_viewer->orientation(); TPoint pos(event->pos().x(), event->pos().y()); - int row = m_viewer->yToRow(pos.y); - int col = m_viewer->xToColumn(pos.x); + CellPosition cellPosition = m_viewer->xyToPosition(event->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); // Se la colonna e' sound non devo fare nulla TXshColumn *column = m_viewer->getXsheet()->getColumn(col); if (column && (column->getSoundColumn() || column->getSoundTextColumn())) @@ -2055,8 +2291,8 @@ void CellArea::mouseDoubleClickEvent(QMouseEvent *event) { for (i = notes->getCount() - 1; i >= 0; i--) { int r = notes->getNoteRow(i); int c = notes->getNoteCol(i); - TPointD pos = notes->getNotePos(i) + - TPointD(m_viewer->columnToX(c), m_viewer->rowToY(r)); + QPoint xy = m_viewer->positionToXY(CellPosition(r, c)); + TPointD pos = notes->getNotePos(i) + TPointD(xy.x(), xy.y()); QRect rect(pos.x, pos.y, NoteWidth, NoteHeight); if (!rect.contains(event->pos())) continue; m_viewer->setCurrentNoteIndex(i); @@ -2068,13 +2304,18 @@ void CellArea::mouseDoubleClickEvent(QMouseEvent *event) { oh->setObjectId(m_viewer->getObjectId(col)); if (Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled()) { - int x = pos.x - m_viewer->columnToX(col); - TStageObject *pegbar = - m_viewer->getXsheet()->getStageObject(m_viewer->getObjectId(col)); - bool isKeyFrameArea = (pegbar && pegbar->isKeyframe(row) && - ColumnWidth - 13 <= x && x <= ColumnWidth) - ? true - : false; + QPoint cellTopLeft = m_viewer->positionToXY(CellPosition(row, col)); + QPoint mouseInCell = event->pos() - cellTopLeft; + TXsheet *xsh = m_viewer->getXsheet(); + TStageObject *pegbar = xsh->getStageObject(m_viewer->getObjectId(col)); + int k0, k1; + bool isKeyframeFrame = pegbar && pegbar->getKeyframeRange(k0, k1) && + k0 <= row && row <= k1 + 1; + bool isKeyFrameArea = + isKeyframeFrame && + o->rect(PredefinedRect::KEYFRAME_AREA).contains(mouseInCell) && + row < k1 + 1; + // If you are in the keyframe area, open a function editor if (isKeyFrameArea) { QAction *action = @@ -2100,9 +2341,11 @@ void CellArea::mouseDoubleClickEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- void CellArea::contextMenuEvent(QContextMenuEvent *event) { + const Orientation *o = m_viewer->orientation(); TPoint pos(event->pos().x(), event->pos().y()); - int row = m_viewer->yToRow(pos.y); - int col = m_viewer->xToColumn(pos.x); + CellPosition cellPosition = m_viewer->xyToPosition(event->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); QMenu menu(this); @@ -2112,8 +2355,8 @@ void CellArea::contextMenuEvent(QContextMenuEvent *event) { for (i = notes->getCount() - 1; i >= 0; i--) { int r = notes->getNoteRow(i); int c = notes->getNoteCol(i); - TPointD pos = notes->getNotePos(i) + - TPointD(m_viewer->columnToX(c), m_viewer->rowToY(r)); + QPoint xy = m_viewer->positionToXY(CellPosition(r, c)); + TPointD pos = notes->getNotePos(i) + TPointD(xy.x(), xy.y()); QRect rect(pos.x, pos.y, NoteWidth, NoteHeight); if (!rect.contains(event->pos())) continue; m_viewer->setCurrentNoteIndex(i); @@ -2123,17 +2366,24 @@ void CellArea::contextMenuEvent(QContextMenuEvent *event) { } TXsheet *xsh = m_viewer->getXsheet(); - int x0 = m_viewer->columnToX(col); - int y1 = m_viewer->rowToY(row) - 1; + int x0 = m_viewer->positionToXY(cellPosition).x(); int x = pos.x - x0; TStageObject *pegbar = xsh->getStageObject(m_viewer->getObjectId(col)); int k0, k1; int r0, r1, c0, c1; if (col >= 0) m_viewer->getCellSelection()->getSelectedCells(r0, c0, r1, c1); - if (pegbar && pegbar->getKeyframeRange(k0, k1) && k0 <= row && row <= k1 && - ColumnWidth - 13 <= x && x <= ColumnWidth && - Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled()) { + QPoint cellTopLeft = m_viewer->positionToXY(CellPosition(row, col)); + QPoint mouseInCell = event->pos() - cellTopLeft; + bool isKeyframeFrame = + Preferences::instance()->isShowKeyframesOnXsheetCellAreaEnabled() && + pegbar && pegbar->getKeyframeRange(k0, k1) && k0 <= row && row <= k1 + 1; + bool isKeyFrameArea = + isKeyframeFrame && + o->rect(PredefinedRect::KEYFRAME_AREA).contains(mouseInCell) && + row < k1 + 1; + + if (isKeyFrameArea) { TStageObjectId objectId; if (col < 0) objectId = TStageObjectId::CameraId(0); diff --git a/toonz/sources/toonz/xshcellviewer.h b/toonz/sources/toonz/xshcellviewer.h index 2bd4762..677c6e4 100644 --- a/toonz/sources/toonz/xshcellviewer.h +++ b/toonz/sources/toonz/xshcellviewer.h @@ -5,6 +5,7 @@ #include #include +#include "orientation.h" // forward declaration class XsheetViewer; @@ -70,11 +71,27 @@ class CellArea final : public QWidget { RenameCellField *m_renameCell; void drawCells(QPainter &p, const QRect toBeUpdated); + void drawNonEmptyBackground(QPainter &p) const; + void drawFoldedColumns(QPainter &p, int layerAxis, + const NumberRange &frameAxis) const; + void drawSelectionBackground(QPainter &p) const; + void drawExtenderHandles(QPainter &p); + + void drawDragHandle(QPainter &p, const QPoint &xy, + const QColor &sideColor) const; + void drawEndOfDragHandle(QPainter &p, bool isEnd, const QPoint &xy, + const QColor &cellColor) const; + void drawLockedDottedLine(QPainter &p, bool isLocked, const QPoint &xy, + const QColor &cellColor) const; + void drawLevelCell(QPainter &p, int row, int col, bool isReference = false); void drawSoundTextCell(QPainter &p, int row, int col); void drawSoundCell(QPainter &p, int row, int col); void drawPaletteCell(QPainter &p, int row, int col, bool isReference = false); + void drawKeyframe(QPainter &p, const QRect toBeUpdated); + void drawKeyframeLine(QPainter &p, int col, const NumberRange &rows) const; + void drawNotes(QPainter &p, const QRect toBeUpdated); // Restistusce true diff --git a/toonz/sources/toonz/xshcolumnviewer.cpp b/toonz/sources/toonz/xshcolumnviewer.cpp index 452ba19..30f064d 100644 --- a/toonz/sources/toonz/xshcolumnviewer.cpp +++ b/toonz/sources/toonz/xshcolumnviewer.cpp @@ -1,5 +1,4 @@ - #include "xshcolumnviewer.h" // Tnz6 includes @@ -111,6 +110,8 @@ const QIcon getColorChipIcon(const int id) { pixmap.fill(colors.at(id - 1)); return QIcon(pixmap); } + +bool isCtrlPressed = false; } //----------------------------------------------------------------------------- @@ -451,14 +452,15 @@ void ChangeObjectHandle::onTextChanged(const QString &text) { RenameColumnField::RenameColumnField(QWidget *parent, XsheetViewer *viewer) : QLineEdit(parent), m_col(-1) { - setFixedSize(XsheetGUI::ColumnWidth + 3, XsheetGUI::RowHeight + 4); + setFixedSize(20, 20); connect(this, SIGNAL(returnPressed()), SLOT(renameColumn())); } //----------------------------------------------------------------------------- -void RenameColumnField::show(QPoint pos, int col) { - move(pos); +void RenameColumnField::show(const QRect &rect, int col) { + move(rect.topLeft()); + setFixedSize(rect.size()); #ifdef _WIN32 static QFont font("Arial", -1, QFont::Normal); #else @@ -517,6 +519,448 @@ void RenameColumnField::focusOutEvent(QFocusEvent *e) { //============================================================================= // ColumnArea //----------------------------------------------------------------------------- + +void ColumnArea::onControlPressed(bool pressed) { + isCtrlPressed = pressed; + update(); +} + +const bool ColumnArea::isControlPressed() { return isCtrlPressed; } + +//----------------------------------------------------------------------------- + +ColumnArea::DrawHeader::DrawHeader(ColumnArea *nArea, QPainter &nP, int nCol) + : area(nArea), p(nP), col(nCol) { + m_viewer = area->m_viewer; + o = m_viewer->orientation(); + app = TApp::instance(); + xsh = m_viewer->getXsheet(); + column = col >= 0 ? xsh->getColumn(col) : 0; + isEmpty = col >= 0 && xsh->isColumnEmpty(col); + + TStageObjectId currentColumnId = app->getCurrentObject()->getObjectId(); + + // check if the column is current + isCurrent = false; + if (currentColumnId == TStageObjectId::CameraId(0)) // CAMERA + isCurrent = col == -1; + else + isCurrent = m_viewer->getCurrentColumn() == col; + + orig = m_viewer->positionToXY(CellPosition(0, max(col, 0))); +} + +void ColumnArea::DrawHeader::prepare() const { +// Preparing painter +#ifdef _WIN32 + QFont font("Arial", -1, QFont::Normal); +#else + QFont font("Helvetica", -1, QFont::Normal); +#endif + font.setPixelSize(XSHEET_FONT_PX_SIZE); + + p.setFont(font); + p.setRenderHint(QPainter::SmoothPixmapTransform, true); +} + +//----------------------------------------------------------------------------- +const QPixmap &ColumnArea::Pixmaps::eye() { + static QPixmap eye = QPixmap(":Resources/x_prev_eye.png"); + return eye; +} +const QPixmap &ColumnArea::Pixmaps::cameraStand() { + static QPixmap cameraStand = QPixmap(":Resources/x_table_view.png"); + return cameraStand; +} +const QPixmap &ColumnArea::Pixmaps::cameraStandTransparent() { + static QPixmap cameraStandTransparent = + QPixmap(":Resources/x_table_view_transp.png"); + return cameraStandTransparent; +} +const QPixmap &ColumnArea::Pixmaps::lock() { + static QPixmap lock = QPixmap(":Resources/x_lock.png"); + return lock; +} +const QPixmap &ColumnArea::Pixmaps::sound() { + static QPixmap sound = QPixmap(":Resources/sound_header_off.png"); + return sound; +} +const QPixmap &ColumnArea::Pixmaps::soundPlaying() { + static QPixmap soundPlaying = QPixmap(":Resources/sound_header_on.png"); + return soundPlaying; +} +//----------------------------------------------------------------------------- + +void ColumnArea::DrawHeader::levelColors(QColor &columnColor, + QColor &dragColor) const { + enum { Normal, Reference, Control } usage = Reference; + if (column) { + if (column->isControl()) usage = Control; + if (column->isRendered() || column->getMeshColumn()) usage = Normal; + } + + if (usage == Reference) { + columnColor = m_viewer->getReferenceColumnColor(); + dragColor = m_viewer->getReferenceColumnBorderColor(); + } else + m_viewer->getColumnColor(columnColor, dragColor, col, xsh); +} +void ColumnArea::DrawHeader::soundColors(QColor &columnColor, + QColor &dragColor) const { + m_viewer->getColumnColor(columnColor, dragColor, col, xsh); +} +void ColumnArea::DrawHeader::paletteColors(QColor &columnColor, + QColor &dragColor) const { + enum { Normal, Reference, Control } usage = Reference; + if (column) { // Check if column is a mask + if (column->isControl()) usage = Control; + if (column->isRendered()) usage = Normal; + } + + if (usage == Reference) { + columnColor = m_viewer->getReferenceColumnColor(); + dragColor = m_viewer->getReferenceColumnBorderColor(); + } else { + columnColor = m_viewer->getPaletteColumnColor(); + dragColor = m_viewer->getPaletteColumnBorderColor(); + } +} + +void ColumnArea::DrawHeader::drawBaseFill(const QColor &columnColor, + const QColor &dragColor) const { + // check if the column is reference + bool isEditingSpline = app->getCurrentObject()->isSpline(); + + QRect rect = o->rect(PredefinedRect::LAYER_HEADER).translated(orig); + + int x0 = rect.left(); + int x1 = rect.right(); + int y0 = rect.top(); + int y1 = rect.bottom(); + + // fill base color + if (isEmpty || col < 0) { + p.fillRect(rect, m_viewer->getEmptyColumnHeadColor()); + + p.setPen(m_viewer->getVerticalLineHeadColor()); + QLine vertical = + o->verticalLine(m_viewer->columnToLayerAxis(col), o->frameSide(rect)); + p.drawLine(vertical); + } else { + p.fillRect(rect, columnColor); + + // column handle + QRect sideBar = o->rect(PredefinedRect::DRAG_LAYER).translated(x0, y0); + + p.fillRect(sideBar, sideBar.contains(area->m_pos) ? Qt::yellow : dragColor); + } + + // highlight selection + bool isSelected = + m_viewer->getColumnSelection()->isColumnSelected(col) && !isEditingSpline; + bool isCameraSelected = col == -1 && isCurrent && !isEditingSpline; + + QColor pastelizer(m_viewer->getColumnHeadPastelizer()); + pastelizer.setAlpha(50); + + QColor colorSelection(m_viewer->getSelectedColumnHead()); + colorSelection.setAlpha(170); + p.fillRect(rect, + (isSelected || isCameraSelected) ? colorSelection : pastelizer); +} + +void ColumnArea::DrawHeader::drawEye() const { + if (col < 0 || isEmpty) return; + if (!column->isPreviewVisible() || column->getPaletteColumn() || + column->getSoundTextColumn()) + return; + + QRect prevViewRect = o->rect(PredefinedRect::EYE_AREA).translated(orig); + QRect eyeRect = o->rect(PredefinedRect::EYE).translated(orig); + // preview visible toggle + p.fillRect(prevViewRect, PreviewVisibleColor); + p.drawPixmap(eyeRect, Pixmaps::eye()); +} + +void ColumnArea::DrawHeader::drawPreviewToggle(int opacity) const { + if (col < 0 || isEmpty) return; + // camstand visible toggle + if (!column->isCamstandVisible() || column->getPaletteColumn() || + column->getSoundTextColumn()) + return; + + QRect tableViewRect = + o->rect(PredefinedRect::PREVIEW_LAYER_AREA).translated(orig); + QRect tableViewImgRect = + o->rect(PredefinedRect::PREVIEW_LAYER).translated(orig); + + p.fillRect(tableViewRect, CamStandVisibleColor); + p.drawPixmap(tableViewImgRect, opacity < 255 + ? Pixmaps::cameraStandTransparent() + : Pixmaps::cameraStand()); +} + +void ColumnArea::DrawHeader::drawLock() const { + if (col < 0 || isEmpty) return; + + QRect lockModeRect = o->rect(PredefinedRect::LOCK_AREA).translated(orig); + QRect lockModeImgRect = o->rect(PredefinedRect::LOCK).translated(orig); + + // lock button + p.setPen(Qt::gray); + p.setBrush(QColor(255, 255, 255, 128)); + p.drawRect(lockModeRect); + p.setBrush(Qt::NoBrush); + bool isLocked = column && column->isLocked(); + if (isLocked) p.drawPixmap(lockModeImgRect, Pixmaps::lock()); +} + +void ColumnArea::DrawHeader::drawColumnNumber() const { + if (o->isVerticalTimeline()) return; + if (col < 0 || isEmpty || + !Preferences::instance()->isShowColumnNumbersEnabled()) + return; + + if (!isEmpty) + p.setPen((isCurrent) ? Qt::red : Qt::black); + else + p.setPen((isCurrent) ? m_viewer->getSelectedColumnTextColor() + : m_viewer->getTextColor()); + + QRect pos = o->rect(PredefinedRect::LAYER_NUMBER).translated(orig); + if (pos.isEmpty()) return; + p.drawText(pos, Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextSingleLine, + QString::number(col + 1)); +} + +void ColumnArea::DrawHeader::drawColumnName() const { + TStageObjectId columnId = m_viewer->getObjectId(col); + TStageObject *columnObject = xsh->getStageObject(columnId); + + // Build column name + std::string name(columnObject->getName()); + if (col < 0) name = std::string("Camera"); + + // ZeraryFx columns store name elsewhere + TXshZeraryFxColumn *zColumn = dynamic_cast(column); + if (zColumn) + name = ::to_string(zColumn->getZeraryColumnFx()->getZeraryFx()->getName()); + + QRect columnName = o->rect(PredefinedRect::LAYER_NAME).translated(orig); + + int rightadj = -2; + int leftadj = 3; + + if (!isEmpty) { + if (Preferences::instance()->isShowColumnNumbersEnabled()) { + if (o->isVerticalTimeline()) + rightadj = -20; + else + leftadj = 24; + } + + if (!o->isVerticalTimeline()) { + if (column->getSoundColumn()) + rightadj -= 97; + else if (column->getFilterColorId()) + rightadj -= 15; + } + + p.setPen((isCurrent) ? Qt::red : Qt::black); + } else + p.setPen((isCurrent) ? m_viewer->getSelectedColumnTextColor() + : m_viewer->getTextColor()); + + if (o->isVerticalTimeline()) + p.drawText(columnName.adjusted(leftadj, 0, rightadj, 0), + Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, + QString(name.c_str())); + else + p.drawText(columnName.adjusted(leftadj, 0, rightadj, 0), + Qt::AlignLeft | Qt::AlignBottom | Qt::TextSingleLine, + QString(name.c_str())); +} + +void ColumnArea::DrawHeader::drawThumbnail(QPixmap &iconPixmap) const { + if (col < 0 || isEmpty) return; + + QRect thumbnailRect = + o->rect(PredefinedRect::THUMBNAIL_AREA).translated(orig); + + // sound thumbnail + if (column->getSoundColumn()) { + TXshSoundColumn *sc = + xsh->getColumn(col) ? xsh->getColumn(col)->getSoundColumn() : 0; + + drawSoundIcon(sc->isPlaying()); + drawVolumeControl(sc->getVolume()); + return; + } + + if (!o->isVerticalTimeline()) return; + + QRect thumbnailImageRect = + o->rect(PredefinedRect::THUMBNAIL).translated(orig); + + // pallete thumbnail + if (column->getPaletteColumn()) { + p.drawPixmap(thumbnailImageRect, iconPixmap); + return; + } + + // soundtext thumbnail + if (column->getSoundTextColumn()) { + p.drawPixmap(thumbnailImageRect, iconPixmap); + return; + } + + // All other thumbnails + p.setPen(m_viewer->getTextColor()); + + // for zerary fx, display fxId here instead of thumbnail + TXshZeraryFxColumn *zColumn = dynamic_cast(column); + if (zColumn) { + QFont lastfont = p.font(); + QFont font("Verdana", 8); + p.setFont(font); + + TFx *fx = zColumn->getZeraryColumnFx()->getZeraryFx(); + QString fxName = QString::fromStdWString(fx->getFxId()); + p.drawText(thumbnailImageRect, Qt::TextWrapAnywhere | Qt::TextWordWrap, + fxName); + p.setFont(lastfont); + } else { + TXshLevelColumn *levelColumn = column->getLevelColumn(); + + if (levelColumn && + Preferences::instance()->getColumnIconLoadingPolicy() == + Preferences::LoadOnDemand && + !levelColumn->isIconVisible()) { + // display nothing + } else { + if (!iconPixmap.isNull()) { + p.drawPixmap(thumbnailImageRect, iconPixmap); + } + // notify that the column icon is already shown + if (levelColumn) levelColumn->setIconVisible(true); + } + } +} + +void ColumnArea::DrawHeader::drawPegbarName() const { + if (col < 0 || isEmpty || !o->isVerticalTimeline()) return; + + TStageObjectId columnId = m_viewer->getObjectId(col); + TStageObjectId parentId = xsh->getStageObjectParent(columnId); + + // pegbar name + QRect pegbarnamerect = o->rect(PredefinedRect::PEGBAR_NAME).translated(orig); + + if (column->getSoundColumn() || column->getSoundTextColumn() || + column->getPaletteColumn()) + return; + + p.setPen(m_viewer->getTextColor()); + + p.drawText(pegbarnamerect.adjusted(3, 0, 0, 0), + Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, + QString(parentId.toString().c_str())); +} + +void ColumnArea::DrawHeader::drawParentHandleName() const { + if (col < 0 || isEmpty || !o->isVerticalTimeline() || + column->getSoundColumn() || column->getSoundTextColumn() || + column->getPaletteColumn()) + return; + + QRect parenthandleRect = + o->rect(PredefinedRect::PARENT_HANDLE_NAME).translated(orig); + + TStageObjectId columnId = m_viewer->getObjectId(col); + TStageObjectId parentId = xsh->getStageObjectParent(columnId); + + p.setPen(m_viewer->getTextColor()); + + std::string handle = xsh->getStageObject(columnId)->getParentHandle(); + if (handle[0] == 'H' && handle.length() > 1) handle = handle.substr(1); + if (parentId != TStageObjectId::TableId) + p.drawText(parenthandleRect, + Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextSingleLine, + QString::fromStdString(handle)); +} + +void ColumnArea::DrawHeader::drawFilterColor() const { + if (col < 0 || isEmpty || !column->getFilterColorId() || + column->getSoundColumn() || column->getSoundTextColumn() || + column->getPaletteColumn()) + return; + + QRect filterColorRect = + o->rect(PredefinedRect::FILTER_COLOR).translated(orig); + p.drawPixmap(filterColorRect, + getColorChipIcon(column->getFilterColorId()).pixmap(12, 12)); +} + +void ColumnArea::DrawHeader::drawSoundIcon(bool isPlaying) const { + QRect rect = m_viewer->orientation() + ->rect(PredefinedRect::SOUND_ICON) + .translated(orig); + p.drawPixmap(rect, isPlaying ? Pixmaps::soundPlaying() : Pixmaps::sound()); +} + +void ColumnArea::DrawHeader::drawVolumeControl(double volume) const { + // slider subdivisions + p.setPen(m_viewer->getTextColor()); + QPoint divisionsTopLeft = + o->point(PredefinedPoint::VOLUME_DIVISIONS_TOP_LEFT) + orig; + int layerAxis = o->layerAxis(divisionsTopLeft); + int frameAxis = o->frameAxis(divisionsTopLeft); + if (o->isVerticalTimeline()) { + for (int i = 0; i <= 20; i++, frameAxis += 3) + if ((i % 10) == 0) + p.drawLine(o->horizontalLine(frameAxis, + NumberRange(layerAxis - 3, layerAxis))); + else if (i & 1) + p.drawLine( + o->horizontalLine(frameAxis, NumberRange(layerAxis, layerAxis))); + else + p.drawLine(o->horizontalLine(frameAxis, + NumberRange(layerAxis - 2, layerAxis))); + } else { + for (int i = 0; i <= 20; i++, frameAxis += 3) + if ((i % 10) == 0) + p.drawLine(o->horizontalLine(frameAxis, + NumberRange(layerAxis, layerAxis + 3))); + else if (i & 1) + p.drawLine( + o->horizontalLine(frameAxis, NumberRange(layerAxis, layerAxis))); + else + p.drawLine(o->horizontalLine(frameAxis, + NumberRange(layerAxis, layerAxis + 2))); + } + + // slider track + QPainterPath track = + o->path(PredefinedPath::VOLUME_SLIDER_TRACK).translated(orig); + p.drawPath(track); + + // cursor + QRect trackRect = o->rect(PredefinedRect::VOLUME_TRACK).translated(orig); + if (o->flipVolume()) volume = 1 - volume; + + layerAxis = o->layerSide(trackRect).middle(); + frameAxis = o->frameSide(trackRect).weight(volume); + QPoint cursor = o->frameLayerToXY(frameAxis, layerAxis); + QPainterPath head = + o->path(PredefinedPath::VOLUME_SLIDER_HEAD).translated(cursor); + p.fillPath(head, QBrush(Qt::white)); + p.setPen(m_viewer->getLightLineColor()); + p.drawPath(head); +} + +//============================================================================= +// ColumnArea +//----------------------------------------------------------------------------- #if QT_VERSION >= 0x050500 ColumnArea::ColumnArea(XsheetViewer *parent, Qt::WindowFlags flags) #else @@ -524,18 +968,11 @@ ColumnArea::ColumnArea(XsheetViewer *parent, Qt::WFlags flags) #endif : QWidget(parent, flags) , m_viewer(parent) - , m_indexBox(0, 3, ColumnWidth - RowHeight * 3 - 1, RowHeight) - , m_tabBox(ColumnWidth - RowHeight * 3 - 1, 3, RowHeight * 3, RowHeight + 1) - , m_nameBox(0, RowHeight + 3, ColumnWidth, RowHeight) - , m_linkBox(0, RowHeight * 7 + 3, 12, RowHeight) , m_pos(-1, -1) , m_tooltip(tr("")) , m_col(-1) , m_columnTransparencyPopup(0) , m_transparencyPopupTimer(0) - , m_prevViewBox(10, 6, ColumnWidth - 12, RowHeight - 3) - , m_tableViewBox(10, RowHeight + 6, ColumnWidth - 12, RowHeight - 3) - , m_lockBox(9, RowHeight + 6, RowHeight - 4, RowHeight - 4) , m_isPanning(false) { TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet(); #ifndef LINETEST @@ -585,9 +1022,96 @@ void ColumnArea::setDragTool(DragTool *dragTool) { } //----------------------------------------------------------------------------- +void ColumnArea::drawFoldedColumnHead(QPainter &p, int col) { + const Orientation *o = m_viewer->orientation(); + + QPoint orig = m_viewer->positionToXY(CellPosition(0, col)); + QRect rect = o->rect(PredefinedRect::FOLDED_LAYER_HEADER).translated(orig); + + int x0, y0, x, y; + + if (o->isVerticalTimeline()) { + x0 = rect.topLeft().x() + 1; + y0 = 0; + + p.setPen(m_viewer->getDarkLineColor()); + p.fillRect(x0, y0 + 1, rect.width(), 18, + QBrush(m_viewer->getDarkBGColor())); + p.fillRect(x0, y0 + 17, 2, rect.height() - 34, + QBrush(m_viewer->getLightLightBGColor())); + p.fillRect(x0 + 3, y0 + 20, 2, rect.height() - 36, + QBrush(m_viewer->getLightLightBGColor())); + p.fillRect(x0 + 6, y0 + 17, 2, rect.height() - 34, + QBrush(m_viewer->getLightLightBGColor())); + + p.setPen(Qt::black); + p.drawLine(x0 - 1, y0 + 17, x0 - 1, rect.height()); + p.setPen(m_viewer->getDarkLineColor()); + p.drawLine(x0 + 2, y0 + 17, x0 + 2, rect.height()); + p.drawLine(x0 + 5, y0 + 17, x0 + 5, rect.height()); + p.drawLine(x0, y0 + 17, x0 + 1, 17); + p.drawLine(x0 + 3, y0 + 20, x0 + 4, 20); + p.drawLine(x0 + 6, y0 + 17, x0 + 7, 17); + + // triangolini + p.setPen(Qt::black); + x = x0; + y = 12; + p.drawPoint(QPointF(x, y)); + x++; + p.drawLine(x, y - 1, x, y + 1); + x++; + p.drawLine(x, y - 2, x, y + 2); + x += 3; + p.drawLine(x, y - 2, x, y + 2); + x++; + p.drawLine(x, y - 1, x, y + 1); + x++; + p.drawPoint(x, y); + } else { + x0 = 0; + y0 = rect.topLeft().y() + 1; + + p.setPen(m_viewer->getDarkLineColor()); + p.fillRect(x0 + 1, y0, 18, rect.height(), + QBrush(m_viewer->getDarkBGColor())); + p.fillRect(x0 + 17, y0, rect.width() - 34, 2, + QBrush(m_viewer->getLightLightBGColor())); + p.fillRect(x0 + 20, y0 + 3, rect.width() - 36, 2, + QBrush(m_viewer->getLightLightBGColor())); + p.fillRect(x0 + 17, y0 + 6, rect.width() - 34, 2, + QBrush(m_viewer->getLightLightBGColor())); + + p.setPen(Qt::black); + p.drawLine(x0 + 17, y0 - 1, rect.width(), y0 - 1); + p.setPen(m_viewer->getDarkLineColor()); + p.drawLine(x0 + 17, y0 + 2, rect.width(), y0 + 2); + p.drawLine(x0 + 17, y0 + 5, rect.width(), y0 + 5); + p.drawLine(x0 + 17, y0, 17, y0 + 1); + p.drawLine(x0 + 20, y0 + 3, 20, y0 + 4); + p.drawLine(x0 + 17, y0 + 6, 17, y0 + 7); + + // triangolini + p.setPen(Qt::black); + x = 12; + y = y0; + p.drawPoint(QPointF(x, y)); + y++; + p.drawLine(x - 1, y, x + 1, y); + y++; + p.drawLine(x - 2, y, x + 2, y); + y += 3; + p.drawLine(x - 2, y, x + 2, y); + y++; + p.drawLine(x - 1, y, x + 1, y); + y++; + p.drawPoint(x, y); + } +} void ColumnArea::drawLevelColumnHead(QPainter &p, int col) { TColumnSelection *selection = m_viewer->getColumnSelection(); + const Orientation *o = m_viewer->orientation(); // Preparing painter #ifdef _WIN32 @@ -602,9 +1126,10 @@ void ColumnArea::drawLevelColumnHead(QPainter &p, int col) { // Retrieve reference coordinates int currentColumnIndex = m_viewer->getCurrentColumn(); - int x = m_viewer->columnToX(col); + int layerAxis = m_viewer->columnToLayerAxis(col); - QRect rect(x, 0, ColumnWidth, height()); + QPoint orig = m_viewer->positionToXY(CellPosition(0, col)); + QRect rect = o->rect(PredefinedRect::LAYER_HEADER).translated(orig); TApp *app = TApp::instance(); TXsheet *xsh = m_viewer->getXsheet(); @@ -612,29 +1137,13 @@ void ColumnArea::drawLevelColumnHead(QPainter &p, int col) { TStageObjectId columnId = m_viewer->getObjectId(col); TStageObjectId currentColumnId = app->getCurrentObject()->getObjectId(); TStageObjectId parentId = xsh->getStageObjectParent(columnId); - TStageObject *columnObject = xsh->getStageObject(columnId); - - // Build column name - std::string name(columnObject->getName()); - - if (col < 0) name = std::string("Camera"); // Retrieve column properties - bool isEmpty = false; - if (col >= 0) // Verifico se la colonna e' vuota - isEmpty = xsh->isColumnEmpty(col); - - bool isEditingSpline = app->getCurrentObject()->isSpline(); - - // check if the column is reference + // Check if the column is empty + bool isEmpty = col >= 0 && xsh->isColumnEmpty(col); TXshColumn *column = col >= 0 ? xsh->getColumn(col) : 0; - enum { Normal, Reference, Control } usage = Reference; - if (column) { - if (column->isControl()) usage = Control; - if (column->isRendered() || column->getMeshColumn()) usage = Normal; - } - bool isLocked = column != 0 && column->isLocked(); + bool isEditingSpline = app->getCurrentObject()->isSpline(); // check if the column is current bool isCurrent = false; @@ -648,159 +1157,30 @@ void ColumnArea::drawLevelColumnHead(QPainter &p, int col) { bool isCameraSelected = col == -1 && isCurrent && !isEditingSpline; // Draw column - QPoint orig = rect.topLeft(); - - QPoint columnNamePos = orig + QPoint(12, RowHeight); - QPoint pegbarNamePos = orig + QPoint(12, RowHeight * 3 + 48); - QPoint handleNamePos = - orig + - QPoint(ColumnWidth - 10 - p.fontMetrics().width('B'), RowHeight * 3 + 48); - - int x0 = rect.x(); - int x1 = x0 + rect.width() - 1; - int y0 = rect.y(); - int y1 = y0 + rect.height() - 1; - - // fill base color - if (isEmpty || col < 0) { - p.fillRect(rect, m_viewer->getEmptyColumnHeadColor()); - - p.setPen(m_viewer->getVerticalLineHeadColor()); - p.drawLine(x0, y0, x0, y1); - } else { - QColor columnColor, sideColor; - if (usage == Reference) { - columnColor = m_viewer->getReferenceColumnColor(); - sideColor = m_viewer->getReferenceColumnBorderColor(); - } else - m_viewer->getColumnColor(columnColor, sideColor, col, xsh); - p.fillRect(rect, sideColor); - p.fillRect(rect.adjusted(7, 3, 0, 0), columnColor); - - // column handle - QRect sideBar(x0, y0, 7, rect.height() - 5); - if (sideBar.contains(m_pos)) { - p.fillRect(sideBar, Qt::yellow); - } - } - - QColor pastelizer(m_viewer->getColumnHeadPastelizer()); - pastelizer.setAlpha(50); - - QColor colorSelection(m_viewer->getSelectedColumnHead()); - colorSelection.setAlpha(170); - p.fillRect(rect, - (isSelected || isCameraSelected) ? colorSelection : pastelizer); - - int prevViewImgHeight = RowHeight - 5; - int prevViewImgWidth = prevViewImgHeight * 5 / 4; - - QRect prevViewRect = m_prevViewBox.translated(orig); - QRect prevViewImgRect(prevViewRect.right() - prevViewImgWidth - 1, 7, - prevViewImgWidth, prevViewImgHeight); - static QPixmap prevViewPix = QPixmap(":Resources/x_prev_eye.png"); - - QRect tableViewRect = m_tableViewBox.translated(orig); - QRect tableViewImgRect = prevViewImgRect.translated(0, RowHeight); - static QPixmap tableViewPix = QPixmap(":Resources/x_table_view.png"); - - static QPixmap tableTranspViewPix = - QPixmap(":Resources/x_table_view_transp.png"); - - QRect lockModeRect = m_lockBox.translated(orig); - static QPixmap lockModePix = QPixmap(":Resources/x_lock.png"); - - if (col >= 0 && !isEmpty) { - // preview visible toggle - if (column->isPreviewVisible()) { - p.fillRect(prevViewRect, PreviewVisibleColor); - p.drawPixmap(prevViewImgRect, prevViewPix); - } - // camstand visible toggle - if (column->isCamstandVisible()) { - p.fillRect(tableViewRect, CamStandVisibleColor); - p.drawPixmap(tableViewImgRect, column->getOpacity() < 255 - ? tableTranspViewPix - : tableViewPix); - } - - // lock button - p.setPen(Qt::gray); - p.setBrush(QColor(255, 255, 255, 128)); - p.drawRect(lockModeRect); - lockModeRect.adjust(1, 1, -1, -1); - if (isLocked) { - p.drawPixmap(lockModeRect, lockModePix); - } - } - - // column number - if (!isEmpty) - p.setPen((isCurrent) ? Qt::red : Qt::black); - else - p.setPen((isCurrent) ? m_viewer->getSelectedColumnTextColor() - : m_viewer->getTextColor()); - - p.drawText(columnNamePos, QString(name.c_str())); - - p.setPen(m_viewer->getTextColor()); - - if (col >= 0 && !isEmpty) { - // pegbar name - p.drawText(pegbarNamePos, QString(parentId.toString().c_str())); - - std::string handle = xsh->getStageObject(columnId)->getParentHandle(); - if (handle[0] == 'H' && handle.length() > 1) handle = handle.substr(1); - if (parentId != TStageObjectId::TableId) - p.drawText(handleNamePos, QString::fromStdString(handle)); - - // thumbnail - QRect thumbnailRect(orig.x() + 9, orig.y() + RowHeight * 2 + 7, - ColumnWidth - 11, 42); - - // for zerary fx, display fxId here instead of thumbnail - TXshZeraryFxColumn *zColumn = dynamic_cast(column); - if (zColumn) { - QFont font("Verdana", 8); - p.setFont(font); - - TFx *fx = zColumn->getZeraryColumnFx()->getZeraryFx(); - QString fxName = QString::fromStdWString(fx->getFxId()); - p.drawText(thumbnailRect, Qt::TextWrapAnywhere | Qt::TextWordWrap, - fxName); - } else { - TXshLevelColumn *levelColumn = column->getLevelColumn(); - - if (levelColumn && - Preferences::instance()->getColumnIconLoadingPolicy() == - Preferences::LoadOnDemand && - !levelColumn->isIconVisible()) { - // display nothing - } else { - QPixmap iconPixmap = getColumnIcon(col); - if (!iconPixmap.isNull()) { - p.drawPixmap(thumbnailRect, iconPixmap); - } - // notify that the column icon is already shown - if (levelColumn) levelColumn->setIconVisible(true); - } - - // filter color - if (column->getFilterColorId() != 0) { - QRect filterColorRect(thumbnailRect.topRight().x() - 14, - thumbnailRect.topRight().y(), 14, 14); - p.fillRect(filterColorRect, Qt::white); - p.drawPixmap( - filterColorRect.adjusted(2, 2, -2, -2), - getColorChipIcon(column->getFilterColorId()).pixmap(12, 12)); - } - } - } + DrawHeader drawHeader(this, p, col); + drawHeader.prepare(); + QColor columnColor, dragColor; + drawHeader.levelColors(columnColor, dragColor); + drawHeader.drawBaseFill(columnColor, dragColor); + drawHeader.drawEye(); + drawHeader.drawPreviewToggle(column ? column->getOpacity() : 0); + drawHeader.drawLock(); + drawHeader.drawColumnName(); + drawHeader.drawColumnNumber(); + QPixmap iconPixmap = getColumnIcon(col); + drawHeader.drawThumbnail(iconPixmap); + drawHeader.drawPegbarName(); + drawHeader.drawParentHandleName(); + drawHeader.drawFilterColor(); } + //----------------------------------------------------------------------------- -void ColumnArea::drawSoundColumnHead(QPainter &p, int col) { +void ColumnArea::drawSoundColumnHead(QPainter &p, int col) { // AREA TColumnSelection *selection = m_viewer->getColumnSelection(); + const Orientation *o = m_viewer->orientation(); + + int x = m_viewer->columnToLayerAxis(col); p.setRenderHint(QPainter::SmoothPixmapTransform, true); #ifdef _WIN32 @@ -811,151 +1191,45 @@ void ColumnArea::drawSoundColumnHead(QPainter &p, int col) { font.setPixelSize(XSHEET_FONT_PX_SIZE); p.setFont(font); - int x = m_viewer->columnToX(col); - TXsheet *xsh = m_viewer->getXsheet(); TXshSoundColumn *sc = xsh->getColumn(col) ? xsh->getColumn(col)->getSoundColumn() : 0; - QRect rect(x, 0, ColumnWidth, height()); - - QPoint orig = rect.topLeft(); - QPoint columnNamePos = orig + QPoint(12, RowHeight); - - bool isEmpty = xsh->isColumnEmpty(col); - bool isCurrent = m_viewer->getCurrentColumn() == col; - bool isSelected = m_viewer->getColumnSelection()->isColumnSelected(col); - bool isPrecSelected = - col > 0 ? m_viewer->getColumnSelection()->isColumnSelected(col - 1) - : false; - bool isActive = sc && sc->isPreviewVisible(); - bool isLocked = sc && sc->isLocked(); - bool isLeftBorderHighlighted = isSelected || isPrecSelected; - - int x0 = rect.x(); - int x1 = x0 + rect.width() - 1; - int y0 = rect.y(); - int y1 = y0 + rect.height() - 1; - // base color - if (isEmpty || col < 0) { - p.fillRect(rect, EmptyColumnHeadColor); - p.setPen(m_viewer->getVerticalLineHeadColor()); - p.drawLine(x0, y0, x0, y1); - } else { - QColor columnColor, sideColor; - - m_viewer->getColumnColor(columnColor, sideColor, col, xsh); - - p.fillRect(rect, sideColor); - p.fillRect(rect.adjusted(7, 3, 0, 0), columnColor); - - // column handle - QRect sideBar(x0, y0, 7, rect.height() - 5); - if (sideBar.contains(m_pos)) { - p.fillRect(sideBar, Qt::yellow); - } - } - - QColor pastelizer(m_viewer->getColumnHeadPastelizer()); - pastelizer.setAlpha(50); - - QColor colorSelection(m_viewer->getSelectedColumnHead()); - colorSelection.setAlpha(170); - p.fillRect(rect, (isSelected) ? colorSelection : pastelizer); - - int prevViewImgHeight = RowHeight - 5; - int prevViewImgWidth = prevViewImgHeight * 5 / 4; - - QRect prevViewRect = m_prevViewBox.translated(orig); - QRect prevViewImgRect(prevViewRect.right() - prevViewImgWidth - 1, 7, - prevViewImgWidth, prevViewImgHeight); - static QPixmap prevViewPix = QPixmap(":Resources/x_prev_eye.png"); - - QRect tableViewRect = m_tableViewBox.translated(orig); - QRect tableViewImgRect = prevViewImgRect.translated(0, RowHeight); - static QPixmap tableViewPix = QPixmap(":Resources/x_table_view.png"); - static QPixmap tableTranspViewPix = - QPixmap(":Resources/x_table_view_transp.png"); - - QRect lockModeRect = m_lockBox.translated(orig); - static QPixmap lockModePix = QPixmap(":Resources/x_lock.png"); - - if (col >= 0 && !isEmpty) { - // preview visible toggle - if (isActive) { - p.fillRect(prevViewRect, PreviewVisibleColor); - p.drawPixmap(prevViewImgRect, prevViewPix); - } - // camstand visible toggle - if (sc->isCamstandVisible()) { - p.fillRect(tableViewRect, CamStandVisibleColor); - p.drawPixmap(tableViewImgRect, tableViewPix); - } - - // lock button - p.setPen(Qt::gray); - p.setBrush(QColor(255, 255, 255, 128)); - p.drawRect(lockModeRect); - lockModeRect.adjust(1, 1, -1, -1); - if (isLocked) { - p.drawPixmap(lockModeRect, lockModePix); - } - } - - // column number - p.setPen((isCurrent) ? Qt::red : Qt::black); - p.drawText(columnNamePos, QString(std::to_string(col + 1).c_str())); - - // Icona sound - if (sc->isPlaying()) { - static QPixmap soundActiveIcon = QPixmap(":Resources/sound_header_on.png"); - p.drawPixmap(x + 29, 3 * RowHeight + 4, 40, 30, soundActiveIcon); - } else { - static QPixmap soundIcon = QPixmap(":Resources/sound_header_off.png"); - p.drawPixmap(x + 29, 3 * RowHeight + 4, 40, 30, soundIcon); - } - - QRect rr(rect.x() + 8, RowHeight * 2 + 3, rect.width() - 7, m_tabBox.y() - 3); - - // suddivisioni slider - p.setPen(m_viewer->getTextColor()); - int xa = rr.x() + 7, ya = rr.y() + 4; - int y = ya; - for (int i = 0; i <= 20; i++, y += 3) - if ((i % 10) == 0) - p.drawLine(xa - 3, y, xa, y); - else if (i & 1) - p.drawLine(xa, y, xa, y); - else - p.drawLine(xa - 2, y, xa, y); - - // slider - int ly = 60; - xa += 5; - p.drawPoint(xa, ya); - p.drawPoint(xa, ya + ly); - p.drawLine(xa - 1, ya + 1, xa - 1, ya + ly - 1); - p.drawLine(xa + 1, ya + 1, xa + 1, ya + ly - 1); - - // cursore - QRect cursorRect; - getVolumeCursorRect(cursorRect, sc->getVolume(), rr.topLeft()); - - std::vector pts; - x = cursorRect.x(); - y = cursorRect.y() + 4; - pts.push_back(QPointF(x, y)); - pts.push_back(QPointF(x + 4.0, y + 4.0)); - pts.push_back(QPointF(x + 8.0, y + 4.0)); - pts.push_back(QPointF(x + 8.0, y - 4.0)); - pts.push_back(QPointF(x + 4.0, y - 4.0)); - drawPolygon(p, pts, true, m_viewer->getLightLineColor()); + QPoint orig = m_viewer->positionToXY(CellPosition(0, col)); + QRect rect = m_viewer->orientation() + ->rect(PredefinedRect::LAYER_HEADER) + .translated(orig); + + QPoint columnNamePos = orig + QPoint(12, o->cellHeight()); + + bool isCurrent = m_viewer->getCurrentColumn() == col; + + DrawHeader drawHeader(this, p, col); + drawHeader.prepare(); + QColor columnColor, dragColor; + drawHeader.soundColors(columnColor, dragColor); + drawHeader.drawBaseFill(columnColor, dragColor); + drawHeader.drawEye(); + drawHeader.drawPreviewToggle(255); + drawHeader.drawLock(); + drawHeader.drawColumnName(); + drawHeader.drawColumnNumber(); + // Sound columns don't have an image. Passing in an image + // for arguement, but it will be ignored. + static QPixmap iconignored; + drawHeader.drawThumbnail(iconignored); + drawHeader.drawPegbarName(); + drawHeader.drawParentHandleName(); + drawHeader.drawFilterColor(); } //----------------------------------------------------------------------------- -void ColumnArea::drawPaletteColumnHead(QPainter &p, int col) { +void ColumnArea::drawPaletteColumnHead(QPainter &p, int col) { // AREA TColumnSelection *selection = m_viewer->getColumnSelection(); + const Orientation *o = m_viewer->orientation(); + + QPoint orig = m_viewer->positionToXY(CellPosition(0, max(col, 0))); #ifdef _WIN32 static QFont font("Arial", -1, QFont::Normal); @@ -968,130 +1242,40 @@ void ColumnArea::drawPaletteColumnHead(QPainter &p, int col) { p.setRenderHint(QPainter::SmoothPixmapTransform, true); int currentColumnIndex = m_viewer->getCurrentColumn(); - int x = m_viewer->columnToX(col); + int x = m_viewer->columnToLayerAxis(col); - QRect rect(x, 0, ColumnWidth, height()); + QRect rect(x, 0, o->cellWidth(), height()); - TApp *app = TApp::instance(); TXsheet *xsh = m_viewer->getXsheet(); - TStageObjectId columnId = m_viewer->getObjectId(col); - TStageObjectId currentColumnId = app->getCurrentObject()->getObjectId(); - TStageObjectId parentId = xsh->getStageObjectParent(columnId); - - std::string name = xsh->getStageObject(columnId)->getName(); - bool isEmpty = false; if (col >= 0) // Verifico se la colonna e' vuota - isEmpty = xsh->isColumnEmpty(col); - bool isEditingSpline = app->getCurrentObject()->isSpline(); - - TXshColumn *column = col >= 0 ? xsh->getColumn(col) : 0; - enum { Normal, Reference, Control } usage = Reference; - if (column) { // Verifico se la colonna e' una mask - if (column->isControl()) usage = Control; - if (column->isRendered()) usage = Normal; - } - - bool isLocked = column != 0 && column->isLocked(); - - bool isCurrent = false; - if (currentColumnId == TStageObjectId::CameraId(0)) // CAMERA - isCurrent = col == -1; - else - isCurrent = m_viewer->getCurrentColumn() == col; - - bool isSelected = - m_viewer->getColumnSelection()->isColumnSelected(col) && !isEditingSpline; - bool isCameraSelected = col == -1 && isCurrent && !isEditingSpline; - - QPoint orig = rect.topLeft(); - QPoint columnNamePos = orig + QPoint(12, RowHeight); - QPoint pegbarNamePos = orig + QPoint(12, RowHeight * 3 + 48); - QPoint handleNamePos = - orig + - QPoint(ColumnWidth - 10 - p.fontMetrics().width('B'), RowHeight * 3 + 48); - - int x0 = rect.x(); - int x1 = x0 + rect.width() - 1; - int y0 = rect.y(); - int y1 = y0 + rect.height() - 1; - - // fill base color - if (isEmpty || col < 0) { - p.fillRect(rect, EmptyColumnHeadColor); - p.setPen(m_viewer->getVerticalLineHeadColor()); - p.drawLine(x0, y0, x0, y1); - } else { - QColor columnColor, sideColor; - if (usage == Reference) { - columnColor = m_viewer->getReferenceColumnColor(); - sideColor = m_viewer->getReferenceColumnBorderColor(); - } else { - columnColor = m_viewer->getPaletteColumnColor(); - sideColor = m_viewer->getPaletteColumnBorderColor(); - } - p.fillRect(rect, sideColor); - p.fillRect(rect.adjusted(7, 3, 0, 0), columnColor); - - // column handle - QRect sideBar(x0, y0, 7, rect.height() - 5); - if (sideBar.contains(m_pos)) { - p.fillRect(sideBar, Qt::yellow); - } - } - - QColor pastelizer(m_viewer->getColumnHeadPastelizer()); - pastelizer.setAlpha(50); - - p.fillRect(rect, - (isSelected || isCameraSelected) ? ColorSelection : pastelizer); - - int prevViewImgHeight = RowHeight - 5; - int prevViewImgWidth = prevViewImgHeight * 5 / 4; - - QRect prevViewRect = m_prevViewBox.translated(orig); - QRect prevViewImgRect(prevViewRect.right() - prevViewImgWidth - 1, 7, - prevViewImgWidth, prevViewImgHeight); - static QPixmap prevViewPix = QPixmap(":Resources/x_prev_eye.png"); - - QRect lockModeRect = m_lockBox.translated(orig); - static QPixmap lockModePix = QPixmap(":Resources/x_lock.png"); - - if (col >= 0 && !isEmpty) { - // preiew visible toggle - if (column->isPreviewVisible()) { - p.fillRect(prevViewRect, PreviewVisibleColor); - p.drawPixmap(prevViewImgRect, prevViewPix); - } - - // lock button - p.setPen(Qt::gray); - p.setBrush(QColor(255, 255, 255, 128)); - p.drawRect(lockModeRect); - lockModeRect.adjust(1, 1, -1, -1); - if (isLocked) { - p.drawPixmap(lockModeRect, lockModePix); - } - } - - // column number - p.setPen((isCurrent) ? Qt::red : Qt::black); - p.drawText(columnNamePos, QString(name.c_str())); + isEmpty = xsh->isColumnEmpty(col); - p.setPen(Qt::black); - if (col >= 0 && !isEmpty) { - static QPixmap paletteHeader(":Resources/palette_header.png"); - QRect thumbnailRect(orig.x() + 9, orig.y() + RowHeight * 2 + 7, - ColumnWidth - 11, 42); - p.drawPixmap(thumbnailRect, paletteHeader); - } + DrawHeader drawHeader(this, p, col); + drawHeader.prepare(); + QColor columnColor, dragColor; + drawHeader.paletteColors(columnColor, dragColor); + drawHeader.drawBaseFill(columnColor, dragColor); + drawHeader.drawEye(); + drawHeader.drawPreviewToggle(0); + drawHeader.drawLock(); + drawHeader.drawColumnName(); + drawHeader.drawColumnNumber(); + static QPixmap iconPixmap(":Resources/palette_header.png"); + drawHeader.drawThumbnail(iconPixmap); + drawHeader.drawPegbarName(); + drawHeader.drawParentHandleName(); + drawHeader.drawFilterColor(); } //----------------------------------------------------------------------------- -void ColumnArea::drawSoundTextColumnHead(QPainter &p, int col) { +void ColumnArea::drawSoundTextColumnHead(QPainter &p, int col) { // AREA TColumnSelection *selection = m_viewer->getColumnSelection(); + const Orientation *o = m_viewer->orientation(); + + int x = m_viewer->columnToLayerAxis(col); p.setRenderHint(QPainter::SmoothPixmapTransform, true); #ifdef _WIN32 @@ -1102,10 +1286,7 @@ void ColumnArea::drawSoundTextColumnHead(QPainter &p, int col) { font.setPixelSize(XSHEET_FONT_PX_SIZE); p.setFont(font); - int x = m_viewer->columnToX(col); - QRect rect(x, 0, ColumnWidth, height()); - - int x0, x1, y, y0, y1; + QRect rect(x, 0, o->cellWidth(), height()); TApp *app = TApp::instance(); TXsheet *xsh = m_viewer->getXsheet(); @@ -1115,108 +1296,35 @@ void ColumnArea::drawSoundTextColumnHead(QPainter &p, int col) { bool isEditingSpline = app->getCurrentObject()->isSpline(); - // Verifico se la colonna e' lockata se e' quella corrente e se e' selezionata + // Check if column is locked and selected TXshColumn *column = col >= 0 ? xsh->getColumn(col) : 0; bool isLocked = column != 0 && column->isLocked(); bool isCurrent = m_viewer->getCurrentColumn() == col; bool isSelected = m_viewer->getColumnSelection()->isColumnSelected(col) && !isEditingSpline; - QPoint orig = rect.topLeft(); - x0 = rect.x() + 1; - x1 = orig.x() + m_tabBox.x() + m_tabBox.width(); - y = orig.y() + m_tabBox.height(); - - static QPixmap header(":Resources/magpie.png"); - int iconW = header.width(); - int iconH = header.height(); - QRect iconBox(orig.x() + m_nameBox.x(), - orig.y() + m_nameBox.y() + m_nameBox.height() + 2, iconW + 1, - iconH + 1); - p.drawPixmap(iconBox, header); - - bool isPrecedentColSelected = - selection->isColumnSelected(col - 1) && !isEditingSpline; - // bordo sinistro - if (isSelected || col > 0 && isPrecedentColSelected) { - p.setPen(ColorSelection); - p.drawLine(rect.x(), orig.y(), rect.x(), height()); - p.setPen(m_viewer->getDarkLineColor()); - p.drawLine(rect.x(), orig.y(), rect.x(), y + 2); - } else { - p.setPen(m_viewer->getDarkLineColor()); - p.drawLine(rect.x(), orig.y(), rect.x(), height()); - } - - if (col >= 0) { - // sfondo della parte indice - QRect indexBox(orig.x() + 1, orig.y(), m_indexBox.width(), - m_indexBox.height() + 3); - p.fillRect(indexBox, m_viewer->getDarkBGColor()); - // indice colonna in alto a sinistra - p.setPen(isCurrent ? Qt::red : Qt::black); - p.drawText(indexBox.adjusted(0, 2, -2, 0), Qt::AlignRight, - QString(std::to_string(col + 1).c_str())); - - x0 = orig.x() + m_tabBox.x() + 1; - int x1 = x0 + RowHeight; - int x2 = x0 + 2 * RowHeight; - int x3 = x0 + 3 * RowHeight + 2; - y0 = orig.y() + m_tabBox.y(); - y1 = orig.y() + m_tabBox.height() + 1; - // Sfondo dei due bottoni che non vengono mostrati - p.fillRect(QRect(x0, y0, 2 * RowHeight, RowHeight), - m_viewer->getDarkBGColor()); - p.setPen(m_viewer->getDarkBGColor()); - p.drawLine(x0, y0 - 1, x3, y0 - 1); - p.drawLine(x0, y0 - 2, x3, y0 - 2); - - // Linea di separazione tra indice e nome - p.setPen(m_viewer->getDarkLineColor()); - p.drawLine(orig.x(), y1 + 1, orig.x() + ColumnWidth, y1 + 1); - // contorno del bottone in alto a dx - p.drawLine(x2, y0, x2, y1); - p.drawLine(x2, y0, x3, y0); - - // lucchetto - QRect lockBox(x2 + 1, y0 + 1, 11, 11); - p.fillRect(lockBox, QBrush(m_viewer->getLightLightBGColor())); - if (isLocked) { - static QPixmap lockMode = QPixmap(":Resources/lock_toggle.png"); - p.drawPixmap(lockBox, lockMode); - } - } - - // nome colonna - QColor cellColor = m_viewer->getLightLightBGColor(); - QColor dummyColor; - m_viewer->getColumnColor(cellColor, dummyColor, col, xsh); - QRect nameBox(orig.x() + m_nameBox.x() + 1, orig.y() + m_nameBox.y() + 1, - m_nameBox.width() - 1, m_nameBox.height()); - QColor columnColor = (isSelected) ? ColorSelection : cellColor; - p.fillRect(nameBox, QBrush(columnColor)); - p.setPen(isCurrent ? Qt::red : Qt::black); - p.drawText(nameBox.adjusted(3, -1, -3, 0), Qt::AlignLeft, - QString(name.c_str())); // Adjusted to match with lineEdit - - // separazione fra nome e icona - p.setPen(isSelected ? ColorSelection : m_viewer->getLightLineColor()); - x0 = nameBox.x(); - x1 = x0 + nameBox.width(); - y0 = nameBox.y() + nameBox.height(); - p.drawLine(x0, y0, x1, y0); - - if (isSelected) { - QRect box(x0, y0 + 1, ColumnWidth, height() - 3 * RowHeight - 6); - QRect adjustBox = box.adjusted(0, 0, -2, -1); - p.setPen(ColorSelection); - p.drawRect(adjustBox); - } + DrawHeader drawHeader(this, p, col); + drawHeader.prepare(); + QColor columnColor, dragColor; + drawHeader.paletteColors(columnColor, dragColor); + drawHeader.drawBaseFill(columnColor, dragColor); + drawHeader.drawEye(); + drawHeader.drawPreviewToggle(255); + drawHeader.drawLock(); + drawHeader.drawColumnName(); + drawHeader.drawColumnNumber(); + static QPixmap iconPixmap(":Resources/magpie.png"); + drawHeader.drawThumbnail(iconPixmap); + drawHeader.drawPegbarName(); + drawHeader.drawParentHandleName(); + drawHeader.drawFilterColor(); } //----------------------------------------------------------------------------- QPixmap ColumnArea::getColumnIcon(int columnIndex) { + const Orientation *o = m_viewer->orientation(); + if (columnIndex == -1) { // Indice colonna = -1 -> CAMERA TApp *app = TApp::instance(); static QPixmap camera = QPixmap(":Resources/camera.png"); @@ -1241,67 +1349,34 @@ QPixmap ColumnArea::getColumnIcon(int columnIndex) { IconGenerator::instance()->getIcon(xl, cell.m_frameId, false, onDemand); #ifndef LINETEST return scalePixmapKeepingAspectRatio( - icon, QSize(ColumnWidth, height() - 3 * RowHeight - 8)); + icon, QSize(o->cellWidth(), height() - 3 * o->cellHeight() - 8)); #else return scalePixmapKeepingAspectRatio( - icon, QSize(ColumnWidth, height() - 4 * RowHeight - 8)); + icon, QSize(o->cellWidth(), height() - 4 * o->cellHeight() - 8)); #endif } } //----------------------------------------------------------------------------- -void ColumnArea::paintEvent(QPaintEvent *event) { +void ColumnArea::paintEvent(QPaintEvent *event) { // AREA QRect toBeUpdated = event->rect(); QPainter p(this); p.setClipRect(toBeUpdated); - int c0, c1; // range di righe visibili - c0 = m_viewer->xToColumn(toBeUpdated.left()); - c1 = m_viewer->xToColumn(toBeUpdated.right()); + CellRange cellRange = m_viewer->xyRectToRange(toBeUpdated); + int c0, c1; // range of visible columns + c0 = cellRange.from().layer(); + c1 = cellRange.to().layer(); TXsheet *xsh = m_viewer->getXsheet(); - ColumnFan *columnFan = xsh->getColumnFan(); + ColumnFan *columnFan = xsh->getColumnFan(m_viewer->orientation()); int col; for (col = c0; col <= c1; col++) { // draw column fan (collapsed columns) if (!columnFan->isActive(col)) { - int x = m_viewer->columnToX(col); - QRect rect(x, 0, 8, height()); - int x0 = rect.topLeft().x() + 1; - int y = 16; - - p.setPen(m_viewer->getDarkLineColor()); - p.fillRect(x0, 0, 8, 18, QBrush(m_viewer->getDarkBGColor())); - p.fillRect(x0, y, 2, 84, QBrush(m_viewer->getLightLightBGColor())); - p.fillRect(x0 + 3, y + 3, 2, 82, - QBrush(m_viewer->getLightLightBGColor())); - p.fillRect(x0 + 6, y, 2, 84, QBrush(m_viewer->getLightLightBGColor())); - - p.setPen(m_viewer->getDarkLineColor()); - p.drawLine(x0 - 1, y, x0 - 1, rect.height()); - p.drawLine(x0 + 2, y, x0 + 2, rect.height()); - p.drawLine(x0 + 5, y, x0 + 5, rect.height()); - p.drawLine(x0, y, x0 + 1, y); - p.drawLine(x0 + 3, y + 3, x0 + 4, y + 3); - p.drawLine(x0 + 6, y, x0 + 7, y); - - // triangolini - p.setPen(Qt::black); - x = x0; - y = y - 4; - p.drawPoint(QPointF(x, y)); - x++; - p.drawLine(x, y - 1, x, y + 1); - x++; - p.drawLine(x, y - 2, x, y + 2); - x += 3; - p.drawLine(x, y - 2, x, y + 2); - x++; - p.drawLine(x, y - 1, x, y + 1); - x++; - p.drawPoint(x, y); + drawFoldedColumnHead(p, col); } else if (col >= 0) { TXshColumn *column = m_viewer->getXsheet()->getColumn(col); @@ -1327,7 +1402,10 @@ void ColumnArea::paintEvent(QPaintEvent *event) { p.setPen(grey150); p.setBrush(Qt::NoBrush); - p.drawRect(toBeUpdated.adjusted(0, 0, -1, -1)); + if (m_viewer->orientation()->isVerticalTimeline()) + p.drawRect(toBeUpdated.adjusted(0, 0, -1, -3)); + else + p.drawRect(toBeUpdated.adjusted(0, 0, -3, -1)); if (getDragTool()) getDragTool()->drawColumnsArea(p); } @@ -1498,15 +1576,12 @@ void ColumnArea::openTransparencyPopup() { //---------------------------------------------------------------- -void ColumnArea::startTransparencyPopupTimer(QMouseEvent *e) { +void ColumnArea::startTransparencyPopupTimer(QMouseEvent *e) { // AREA if (!m_columnTransparencyPopup) m_columnTransparencyPopup = new ColumnTransparencyPopup( this); // Qt::ToolTip|Qt::MSWindowsFixedSizeDialogHint);//Qt::MSWindowsFixedSizeDialogHint|Qt::Tool); - int x = e->pos().x() - m_tabBox.left() - m_viewer->columnToX(m_col); - int y = e->pos().y() - m_tabBox.bottom(); - m_columnTransparencyPopup->move(e->globalPos().x() - x + 2, - e->globalPos().y() - y + 1); + m_columnTransparencyPopup->move(e->globalPos().x(), e->globalPos().y()); if (!m_transparencyPopupTimer) { m_transparencyPopupTimer = new QTimer(this); @@ -1522,6 +1597,8 @@ void ColumnArea::startTransparencyPopupTimer(QMouseEvent *e) { //---------------------------------------------------------------- void ColumnArea::mousePressEvent(QMouseEvent *event) { + const Orientation *o = m_viewer->orientation(); + m_doOnRelease = 0; m_viewer->setQtModifiers(event->modifiers()); assert(getDragTool() == 0); @@ -1530,8 +1607,9 @@ void ColumnArea::mousePressEvent(QMouseEvent *event) { // both left and right click can change the selection if (event->button() == Qt::LeftButton || event->button() == Qt::RightButton) { - TXsheet *xsh = m_viewer->getXsheet(); - m_col = m_viewer->xToColumn(event->pos().x()); + TXsheet *xsh = m_viewer->getXsheet(); + ColumnFan *fan = xsh->getColumnFan(o); + m_col = m_viewer->xyToPosition(event->pos()).layer(); // do nothing for the camera column if (m_col < 0) // CAMERA { @@ -1539,14 +1617,14 @@ void ColumnArea::mousePressEvent(QMouseEvent *event) { m_viewer->getColumnSelection()->selectNone(); } // when clicking the column fan - else if (m_col >= 0 && !xsh->getColumnFan()->isActive(m_col)) // column Fan + else if (m_col >= 0 && !fan->isActive(m_col)) // column Fan { - for (;;) { - xsh->getColumnFan()->activate(m_col); - TApp::instance()->getCurrentScene()->setDirtyFlag(true); - m_col--; - if (m_col < 0 || xsh->getColumnFan()->isActive(m_col)) break; + for (auto o : Orientations::all()) { + fan = xsh->getColumnFan(o); + for (int i = m_col; i >= 0 && !fan->isActive(i); i--) fan->activate(i); } + + TApp::instance()->getCurrentScene()->setDirtyFlag(true); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); return; } @@ -1559,40 +1637,53 @@ void ColumnArea::mousePressEvent(QMouseEvent *event) { TApp::instance()->getCurrentObject()->setIsSpline(false); // get mouse position - int x = event->pos().x() - m_viewer->columnToX(m_col); - int y = event->pos().y(); - QPoint mousePos(x, y); + QPoint mouseInCell = + event->pos() - m_viewer->positionToXY(CellPosition(0, m_col)); + // int x = event->pos().x() - m_viewer->columnToX(m_col); + // int y = event->pos().y(); + // QPoint mouseInCell(x, y); + int x = mouseInCell.x(), y = mouseInCell.y(); if (!isEmpty && m_col >= 0) { // grabbing the left side of the column enables column move - if (x <= 7) { + if (o->rect(PredefinedRect::DRAG_LAYER).contains(mouseInCell)) { setDragTool(XsheetGUI::DragTool::makeColumnMoveTool(m_viewer)); } // lock button - else if (m_lockBox.contains(mousePos) && + else if (o->rect(PredefinedRect::LOCK_AREA).contains(mouseInCell) && event->button() == Qt::LeftButton) { - m_doOnRelease = ToggleLock; + m_doOnRelease = isCtrlPressed ? ToggleAllLock : ToggleLock; } // preview button - else if (m_prevViewBox.contains(mousePos) && + else if (o->rect(PredefinedRect::EYE_AREA).contains(mouseInCell) && event->button() == Qt::LeftButton) { - m_doOnRelease = TogglePreviewVisible; - if (column->getSoundColumn()) - TApp::instance()->getCurrentXsheet()->notifyXsheetSoundChanged(); + if (column->getPaletteColumn() || column->getSoundTextColumn()) { + // do nothing + } else { + m_doOnRelease = + isCtrlPressed ? ToggleAllPreviewVisible : TogglePreviewVisible; + if (column->getSoundColumn()) + TApp::instance()->getCurrentXsheet()->notifyXsheetSoundChanged(); + } } // camstand button - else if (m_tableViewBox.contains(mousePos) && + else if (o->rect(PredefinedRect::PREVIEW_LAYER_AREA) + .contains(mouseInCell) && event->button() == Qt::LeftButton) { - m_doOnRelease = ToggleTransparency; - if (column->getSoundColumn()) { + if (column->getPaletteColumn() || column->getSoundTextColumn()) { // do nothing - } else - startTransparencyPopupTimer(event); + } else { + m_doOnRelease = + isCtrlPressed ? ToggleAllTransparency : ToggleTransparency; + if (column->getSoundColumn()) { + // do nothing + } else + startTransparencyPopupTimer(event); + } } - // sound column else if (column && column->getSoundColumn()) { - if (x > 29 && 3 * RowHeight + 5 <= y && y < 3 * RowHeight + 33) { + if (o->rect(PredefinedRect::SOUND_ICON).contains(mouseInCell)) { TXshSoundColumn *s = column->getSoundColumn(); if (s) { if (s->isPlaying()) @@ -1611,19 +1702,11 @@ void ColumnArea::mousePressEvent(QMouseEvent *event) { if (s->isPlaying() && interval > 0) QTimer::singleShot(interval, this, SLOT(update())); } - int x0 = m_viewer->columnToX(m_col); - int x1 = m_viewer->columnToX(m_col + 1); update(); - } else if (x >= 15 && x <= 25 && RowHeight * 2 + 4 < y && - y < 8 * RowHeight + 4) + } else if (o->rect(PredefinedRect::VOLUME_AREA).contains(mouseInCell)) setDragTool(XsheetGUI::DragTool::makeVolumeDragTool(m_viewer)); else setDragTool(XsheetGUI::DragTool::makeColumnSelectionTool(m_viewer)); - } else if (column && column->getSoundTextColumn()) { - if (y < m_tabBox.bottom() || m_nameBox.contains(x, y)) - setDragTool(XsheetGUI::DragTool::makeColumnMoveTool(m_viewer)); - else - setDragTool(XsheetGUI::DragTool::makeColumnSelectionTool(m_viewer)); } // clicking another area means column selection else { @@ -1661,25 +1744,30 @@ void ColumnArea::mousePressEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- void ColumnArea::mouseMoveEvent(QMouseEvent *event) { + const Orientation *o = m_viewer->orientation(); + m_viewer->setQtModifiers(event->modifiers()); QPoint pos = event->pos(); if (m_isPanning) { // Pan tasto centrale QPoint delta = m_pos - pos; - delta.setY(0); + if (o->isVerticalTimeline()) + delta.setY(0); + else + delta.setX(0); m_viewer->scroll(delta); return; } - int col = m_viewer->xToColumn(pos.x()); + int col = m_viewer->xyToPosition(pos).layer(); if (col < -1) col = 0; TXsheet *xsh = m_viewer->getXsheet(); TXshColumn *column = xsh->getColumn(col); - int x = pos.x() - m_viewer->columnToX(col); - int y = pos.y(); + QPoint mouseInCell = pos - m_viewer->positionToXY(CellPosition(0, col)); + int x = mouseInCell.x(), y = mouseInCell.y(); #ifdef LINETEST - // Controllo che il menu del motion Path sia chiuso. + // Ensure that the menu of the motion path is hidden if ((x - m_mtypeBox.left() > 20 || y < m_mtypeBox.y() || y > m_mtypeBox.bottom()) && !m_motionPathMenu->isHidden()) @@ -1688,7 +1776,10 @@ void ColumnArea::mouseMoveEvent(QMouseEvent *event) { if ((event->buttons() & Qt::LeftButton) != 0 && !visibleRegion().contains(pos)) { QRect bounds = visibleRegion().boundingRect(); - m_viewer->setAutoPanSpeed(bounds, QPoint(pos.x(), bounds.top())); + if (o->isVerticalTimeline()) + m_viewer->setAutoPanSpeed(bounds, QPoint(pos.x(), bounds.top())); + else + m_viewer->setAutoPanSpeed(bounds, QPoint(bounds.left(), pos.y())); } else m_viewer->stopAutoPan(); @@ -1704,31 +1795,26 @@ void ColumnArea::mouseMoveEvent(QMouseEvent *event) { TStageObjectId columnId = m_viewer->getObjectId(col); TStageObjectId parentId = xsh->getStageObjectParent(columnId); - QRect sideBar(0, 0, 7, height()); - - if (col < 0) m_tooltip = tr("Click to select camera"); - if (column && column->getSoundTextColumn()) - m_tooltip = tr(""); - else if (sideBar.contains(x, y)) { + if (col < 0) + m_tooltip = tr("Click to select camera"); + else if (o->rect(PredefinedRect::DRAG_LAYER).contains(mouseInCell)) { m_tooltip = tr("Click to select column, drag to move it"); - } else if (m_lockBox.contains(x, y)) { + } else if (o->rect(PredefinedRect::LOCK_AREA).contains(mouseInCell)) { m_tooltip = tr("Lock Toggle"); - } else if (m_prevViewBox.contains(x, y)) { + } else if (o->rect(PredefinedRect::EYE_AREA).contains(mouseInCell)) { m_tooltip = tr("Preview Visibility Toggle"); - } else if (m_tableViewBox.contains(x, y)) { + } else if (o->rect(PredefinedRect::PREVIEW_LAYER_AREA) + .contains(mouseInCell)) { m_tooltip = tr("Camera Stand Visibility Toggle"); } else { if (column && column->getSoundColumn()) { // sound column - if (x > 20 && 3 * RowHeight + 5 <= y && y < 3 * RowHeight + 33) + if (o->rect(PredefinedRect::SOUND_ICON).contains(mouseInCell)) m_tooltip = tr("Click to play the soundtrack back"); - else if (x >= 10 && x <= 20 && RowHeight + RowHeight / 2 < y && - y < 8 * RowHeight - RowHeight / 2) + else if (o->rect(PredefinedRect::VOLUME_AREA).contains(mouseInCell)) m_tooltip = tr("Set the volume of the soundtrack"); - } - - else if (Preferences::instance()->getColumnIconLoadingPolicy() == - Preferences::LoadOnDemand) + } else if (Preferences::instance()->getColumnIconLoadingPolicy() == + Preferences::LoadOnDemand) m_tooltip = tr("Alt + Click to Toggle Thumbnail"); else m_tooltip = tr(""); @@ -1751,9 +1837,11 @@ bool ColumnArea::event(QEvent *event) { //----------------------------------------------------------------------------- void ColumnArea::mouseReleaseEvent(QMouseEvent *event) { - TApp *app = TApp::instance(); + TApp *app = TApp::instance(); + TXsheet *xsh = m_viewer->getXsheet(); + int col, totcols = xsh->getColumnCount(); if (m_doOnRelease != 0 && m_col != -1) { - TXshColumn *column = m_viewer->getXsheet()->getColumn(m_col); + TXshColumn *column = xsh->getColumn(m_col); if (m_doOnRelease == ToggleTransparency && (!m_columnTransparencyPopup || m_columnTransparencyPopup->isHidden())) { column->setCamstandVisible(!column->isCamstandVisible()); @@ -1762,7 +1850,36 @@ void ColumnArea::mouseReleaseEvent(QMouseEvent *event) { column->setPreviewVisible(!column->isPreviewVisible()); else if (m_doOnRelease == ToggleLock) column->lock(!column->isLocked()); - else + else if (m_doOnRelease == ToggleAllPreviewVisible) { + for (col = 0; col < totcols; col++) { + TXshColumn *column = xsh->getColumn(col); + if (!xsh->isColumnEmpty(col) && !column->getPaletteColumn() && + !column->getSoundTextColumn()) { + column->setPreviewVisible(!column->isPreviewVisible()); + } + } + } else if (m_doOnRelease == ToggleAllTransparency) { + bool sound_changed = false; + for (col = 0; col < totcols; col++) { + TXshColumn *column = xsh->getColumn(col); + if (!xsh->isColumnEmpty(col) && !column->getPaletteColumn() && + !column->getSoundTextColumn()) { + column->setCamstandVisible(!column->isCamstandVisible()); + if (column->getSoundColumn()) sound_changed = true; + } + } + + if (sound_changed) { + app->getCurrentXsheet()->notifyXsheetSoundChanged(); + } + } else if (m_doOnRelease == ToggleAllLock) { + for (col = 0; col < totcols; col++) { + TXshColumn *column = xsh->getColumn(col); + if (!xsh->isColumnEmpty(col)) { + column->lock(!column->isLocked()); + } + } + } else assert(false); app->getCurrentScene()->notifySceneChanged(); @@ -1782,27 +1899,26 @@ void ColumnArea::mouseReleaseEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- void ColumnArea::mouseDoubleClickEvent(QMouseEvent *event) { + const Orientation *o = m_viewer->orientation(); + QPoint pos = event->pos(); - int col = m_viewer->xToColumn(pos.x()); - int x0 = m_viewer->columnToX(col); + int col = m_viewer->xyToPosition(pos).layer(); + CellPosition cellPosition(0, col); + QPoint topLeft = m_viewer->positionToXY(cellPosition); + QPoint mouseInCell = pos - topLeft; #ifdef LINETEST // Camera column if (col == -1) return; #endif - if (!m_prevViewBox.translated(x0, 0) - .adjusted(0, 0, -ColumnWidth / 2, 0) - .contains(pos)) { - return; - } + if (!o->rect(PredefinedRect::LAYER_NAME).contains(mouseInCell)) return; TXsheet *xsh = m_viewer->getXsheet(); if (col >= 0 && xsh->isColumnEmpty(col)) return; - pos = QPoint(x0 + m_prevViewBox.x() - 10, m_prevViewBox.y() - 2); - - m_renameColumnField->show(pos, col); + QRect renameRect = o->rect(PredefinedRect::RENAME_COLUMN).translated(topLeft); + m_renameColumnField->show(renameRect, col); } //----------------------------------------------------------------------------- @@ -1817,22 +1933,22 @@ void ColumnArea::contextMenuEvent(QContextMenuEvent *event) { QApplication::instance()->sendEvent(this, &fakeRelease); #endif - QPoint qPos = event->pos(); - TPoint pos(qPos.x(), qPos.y()); - int row = m_viewer->yToRow(pos.y); - int col = m_viewer->xToColumn(pos.x); + const Orientation *o = m_viewer->orientation(); + + int col = m_viewer->xyToPosition(event->pos()).layer(); if (col < 0) // CAMERA return; m_viewer->setCurrentColumn(col); - TXsheet *xsh = m_viewer->getXsheet(); - int x0 = m_viewer->columnToX(col); + TXsheet *xsh = m_viewer->getXsheet(); + QPoint topLeft = m_viewer->positionToXY(CellPosition(0, col)); + QPoint mouseInCell = event->pos() - topLeft; QMenu menu(this); CommandManager *cmdManager = CommandManager::instance(); //---- Preview if (!xsh->isColumnEmpty(col) && - m_prevViewBox.translated(x0, 0).contains(qPos)) { + o->rect(PredefinedRect::EYE_AREA).contains(mouseInCell)) { menu.setObjectName("xsheetColumnAreaMenu_Preview"); menu.addAction(cmdManager->getAction("MI_EnableThisColumnOnly")); @@ -1844,7 +1960,7 @@ void ColumnArea::contextMenuEvent(QContextMenuEvent *event) { } //---- Lock else if (!xsh->isColumnEmpty(col) && - m_lockBox.translated(x0, 0).contains(qPos)) { + o->rect(PredefinedRect::LOCK_AREA).contains(mouseInCell)) { menu.setObjectName("xsheetColumnAreaMenu_Lock"); menu.addAction(cmdManager->getAction("MI_LockThisColumnOnly")); @@ -1856,7 +1972,7 @@ void ColumnArea::contextMenuEvent(QContextMenuEvent *event) { } //---- Camstand else if (!xsh->isColumnEmpty(col) && - m_tableViewBox.translated(x0, 0).contains(qPos)) { + o->rect(PredefinedRect::PREVIEW_LAYER_AREA).contains(mouseInCell)) { menu.setObjectName("xsheetColumnAreaMenu_Camstand"); menu.addAction(cmdManager->getAction("MI_ActivateThisColumnOnly")); diff --git a/toonz/sources/toonz/xshcolumnviewer.h b/toonz/sources/toonz/xshcolumnviewer.h index e4dd076..5240116 100644 --- a/toonz/sources/toonz/xshcolumnviewer.h +++ b/toonz/sources/toonz/xshcolumnviewer.h @@ -6,6 +6,8 @@ #include #include #include +#include +#include // forward declaration class XsheetViewer; @@ -14,6 +16,9 @@ class TXsheetHandle; class TStageObjectId; class TXshColumn; class QComboBox; +class Orientation; +class TApp; +class TXsheet; //============================================================================= namespace XsheetGUI { @@ -134,7 +139,7 @@ public: m_xsheetHandle = xsheetHandle; } - void show(QPoint pos, int col); + void show(const QRect &rect, int col); protected: void focusOutEvent(QFocusEvent *) override; @@ -173,11 +178,18 @@ protected slots: void onFilterColorChanged(int id); }; -//! La classe si occupa della visualizzazione dell'area che gestisce le colonne. +//! The class in charge of the region showing layer headers class ColumnArea final : public QWidget { Q_OBJECT - enum { ToggleTransparency = 1, TogglePreviewVisible, ToggleLock }; + enum { + ToggleTransparency = 1, + ToggleAllTransparency, + TogglePreviewVisible, + ToggleAllPreviewVisible, + ToggleLock, + ToggleAllLock + }; ColumnTransparencyPopup *m_columnTransparencyPopup; QTimer *m_transparencyPopupTimer; @@ -188,9 +200,6 @@ class ColumnArea final : public QWidget { QRect m_tabBox; QRect m_nameBox; QRect m_linkBox; - QRect m_prevViewBox; - QRect m_tableViewBox; - QRect m_lockBox; bool m_isPanning; @@ -214,6 +223,43 @@ class ColumnArea final : public QWidget { void setDragTool(DragTool *dragTool); void startTransparencyPopupTimer(QMouseEvent *e); + // extracted all variables of drawSomething methods + class DrawHeader { + ColumnArea *area; + QPainter &p; + int col; + XsheetViewer *m_viewer; + const Orientation *o; + TApp *app; + TXsheet *xsh; + bool isEmpty, isCurrent; + TXshColumn *column; + QPoint orig; + + public: + DrawHeader(ColumnArea *area, QPainter &p, int col); + + void prepare() const; + + void levelColors(QColor &columnColor, QColor &dragColor) const; + void soundColors(QColor &columnColor, QColor &dragColor) const; + void paletteColors(QColor &columnColor, QColor &dragColor) const; + + void drawBaseFill(const QColor &columnColor, const QColor &dragColor) const; + void drawEye() const; + void drawPreviewToggle(int opacity) const; + void drawLock() const; + void drawColumnNumber() const; + void drawColumnName() const; + void drawThumbnail(QPixmap &iconPixmap) const; + void drawPegbarName() const; + void drawParentHandleName() const; + void drawFilterColor() const; + + void drawSoundIcon(bool isPlaying) const; + void drawVolumeControl(double volume) const; + }; + public: #if QT_VERSION >= 0x050500 ColumnArea(XsheetViewer *parent, Qt::WindowFlags flags = 0); @@ -222,6 +268,10 @@ public: #endif ~ColumnArea(); + void onControlPressed(bool pressed); + const bool isControlPressed(); + + void drawFoldedColumnHead(QPainter &p, int col); void drawLevelColumnHead(QPainter &p, int col); void drawSoundColumnHead(QPainter &p, int col); void drawPaletteColumnHead(QPainter &p, int col); @@ -229,6 +279,16 @@ public: QPixmap getColumnIcon(int columnIndex); + class Pixmaps { + public: + static const QPixmap &eye(); + static const QPixmap &cameraStand(); + static const QPixmap &cameraStandTransparent(); + static const QPixmap &lock(); + static const QPixmap &sound(); + static const QPixmap &soundPlaying(); + }; + protected: void select(int columnIndex, QMouseEvent *event); diff --git a/toonz/sources/toonz/xsheetdragtool.cpp b/toonz/sources/toonz/xsheetdragtool.cpp index 3ea0ed4..3e8b1fd 100644 --- a/toonz/sources/toonz/xsheetdragtool.cpp +++ b/toonz/sources/toonz/xsheetdragtool.cpp @@ -86,22 +86,25 @@ void XsheetGUI::DragTool::refreshRowsArea() { getViewer()->updateRows(); } //----------------------------------------------------------------------------- void XsheetGUI::DragTool::onClick(const QMouseEvent *event) { - QPoint pos = event->pos(); - onClick(getViewer()->yToRow(pos.y()), getViewer()->xToColumn(pos.x())); + QPoint xy = event->pos(); + CellPosition pos = getViewer()->xyToPosition(xy); + onClick(pos); } //----------------------------------------------------------------------------- void XsheetGUI::DragTool::onDrag(const QMouseEvent *event) { - QPoint pos = event->pos(); - onDrag(getViewer()->yToRow(pos.y()), getViewer()->xToColumn(pos.x())); + QPoint xy = event->pos(); + CellPosition pos = getViewer()->xyToPosition(xy); + onDrag(pos); } //----------------------------------------------------------------------------- void XsheetGUI::DragTool::onRelease(const QMouseEvent *event) { - QPoint pos = event->pos(); - onRelease(getViewer()->yToRow(pos.y()), getViewer()->xToColumn(pos.x())); + QPoint xy = event->pos(); + CellPosition pos = getViewer()->xyToPosition(xy); + onRelease(pos); } //============================================================================= @@ -117,11 +120,12 @@ public: : DragTool(viewer), m_firstRow(0), m_firstCol(0), m_modifier() {} // activate when clicked the cell void onClick(const QMouseEvent *event) override { - m_modifier = event->modifiers(); - int row = getViewer()->yToRow(event->pos().y()); - int col = getViewer()->xToColumn(event->pos().x()); - m_firstCol = col; - m_firstRow = row; + m_modifier = event->modifiers(); + CellPosition pos = getViewer()->xyToPosition(event->pos()); + int row = pos.frame(); + int col = pos.layer(); + m_firstCol = col; + m_firstRow = row; if (m_modifier & Qt::ShiftModifier) { int r0, c0, r1, c1; getViewer()->getCellSelection()->getSelectedCells(r0, c0, r1, c1); @@ -171,7 +175,8 @@ public: refreshCellsArea(); refreshRowsArea(); } - void onDrag(int row, int col) override { + void onDrag(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); if (col < 0) return; if (row < 0) row = 0; if (m_modifier & Qt::ControlModifier) @@ -626,7 +631,8 @@ public: , m_invert(invert) {} // called when the smart tab is clicked - void onClick(int row, int col) override { + void onClick(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); int r0, c0, r1, c1; getViewer()->getCellSelection()->getSelectedCells(r0, c0, r1, c1); if (m_invert) @@ -647,7 +653,8 @@ public: m_undo->setCells(xsh, r0, c0, m_rowCount, m_colCount); } - void onDrag(int row, int col) override { + void onDrag(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); if (!m_invert) onCellChange(row, col); else @@ -704,7 +711,7 @@ public: bool found = false; for (int c = 0; c < m_colCount; c++) { TXshColumn *column = xsh->getColumn(m_c0 + c); - if (column && column->getSoundColumn()) continue; + if (!column || column->getSoundColumn()) continue; if (!column->isCellEmpty(emptyRow)) { emptyRow += 1; found = true; @@ -725,7 +732,7 @@ public: // clear cells for (int c = 0; c < m_colCount; c++) { TXshColumn *column = xsh->getColumn(m_c0 + c); - if (column && column->getSoundColumn()) continue; + if (!column || column->getSoundColumn()) continue; xsh->clearCells(m_r0, m_c0 + c, dr); } } @@ -733,7 +740,7 @@ public: else { for (int c = 0; c < m_colCount; c++) { TXshColumn *column = xsh->getColumn(m_c0 + c); - if (column && column->getSoundColumn()) continue; + if (!column || column->getSoundColumn()) continue; for (int r = r0; r <= m_r0 - 1; r++) { xsh->setCell(r, m_c0 + c, m_columns[c].generate(r)); } @@ -744,7 +751,8 @@ public: m_c0 + m_colCount - 1); } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); int delta = m_r1 - (m_r0 + m_rowCount - 1); if (delta == 0) delete m_undo; @@ -883,9 +891,9 @@ public: return soundColumn; } - void onClick(int row, int col) override { - m_firstRow = row; - m_col = col; + void onClick(const CellPosition &pos) override { + m_firstRow = pos.frame(); + m_col = pos.layer(); TXshSoundColumn *soundColumn = getColumn(); if (!soundColumn) return; m_oldColumn = dynamic_cast(soundColumn->clone()); @@ -893,8 +901,8 @@ public: getViewer()->update(); } - void onDrag(int row, int col) override { - onChange(row); + void onDrag(const CellPosition &pos) override { + onChange(pos.frame()); refreshCellsArea(); } @@ -922,7 +930,8 @@ public: TApp::instance()->getCurrentXsheet()->notifyXsheetSoundChanged(); } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { + int row = pos.frame(); if (row - m_firstRow == 0) { m_undo = 0; return; @@ -985,10 +994,11 @@ public: LevelMoverTool::onDrag(e); if (m_validPos) m_keyframeMoverTool->onDrag(e); } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); TUndoManager::manager()->beginBlock(); - LevelMoverTool::onRelease(row, col); - m_keyframeMoverTool->onRelease(row, col); + LevelMoverTool::onRelease(pos); + m_keyframeMoverTool->onRelease(pos); TUndoManager::manager()->endBlock(); } @@ -1089,7 +1099,8 @@ public: , m_r1(0) , m_enable(true) {} - void onClick(int row, int col) override { + void onClick(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); m_r0 = m_r1 = row; TXsheet *xsh = getViewer()->getXsheet(); TStageObjectId cameraId = xsh->getStageObjectTree()->getCurrentCameraId(); @@ -1105,7 +1116,8 @@ public: m_undo = new KeyFrameHandleUndo(objId, m_startRow); } - void onDrag(int row, int col) override { + void onDrag(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); if (!m_enable) return; m_r1 = row; onCellChange(row, col); @@ -1127,7 +1139,8 @@ public: m_stageObject->setKeyframeWithoutUndo(m_startRow, m_k); } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); if (!m_enable) return; if (m_r0 == m_r1) delete m_undo; @@ -1175,21 +1188,22 @@ public: m_startCol = notes->getNoteCol(currentIndex); QPoint p = e->pos(); TPointD mousePos(p.x(), p.y()); - TPointD cellTopLeft(getViewer()->columnToX(m_startCol), - getViewer()->rowToY(m_startRow)); + QPoint xy = getViewer()->positionToXY(CellPosition(m_startRow, m_startCol)); + TPointD cellTopLeft(xy.x(), xy.y()); m_delta = mousePos - (cellTopLeft + m_startPos); } void onChange(TPointD pos) { - pos = pos - m_delta; - int row = getViewer()->yToRow(pos.y); - int col = getViewer()->xToColumn(pos.x); + pos = pos - m_delta; + CellPosition cellPosition = getViewer()->xyToPosition(pos); + int row = cellPosition.frame(); + int col = cellPosition.layer(); if (row < 0) row = 0; if (col < 0) col = 0; - TPointD newPos = - pos - TPointD(getViewer()->columnToX(col), getViewer()->rowToY(row)); + QPoint xy = getViewer()->positionToXY(CellPosition(row, col)); + TPointD newPos = pos - TPointD(xy.x(), xy.y()); if (newPos.x < 0) newPos.x = 0; if (newPos.y < 0) newPos.y = 0; @@ -1252,14 +1266,16 @@ public: TApp::instance()->getCurrentFrame()->getFrame()) , m_isFos(isFos) {} - void onClick(int row, int col) override { + void onClick(const CellPosition &pos) override { + int row = pos.frame(); OnionSkinMask mask = m_modifier.getMask(); TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(mask); m_modifier.click(row, m_isFos); TApp::instance()->getCurrentOnionSkin()->notifyOnionSkinMaskChanged(); } - void onDrag(int row, int col) override { + void onDrag(const CellPosition &pos) override { + int row = pos.frame(); if (row < 0) row = 0; onRowChange(row); TApp::instance()->getCurrentOnionSkin()->notifyOnionSkinMaskChanged(); @@ -1271,7 +1287,8 @@ public: TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(mask); } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { + int row = pos.frame(); m_modifier.release(row); OnionSkinMask mask = m_modifier.getMask(); TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(mask); @@ -1302,12 +1319,14 @@ class CurrentFrameModifier final : public XsheetGUI::DragTool { public: CurrentFrameModifier(XsheetViewer *viewer) : DragTool(viewer) {} - void onClick(int row, int col) override { + void onClick(const CellPosition &pos) override { + int row = pos.frame(); TApp::instance()->getCurrentFrame()->setFrame(row); refreshRowsArea(); } - void onDrag(int row, int col) override { + void onDrag(const CellPosition &pos) override { + int row = pos.frame(); if (row < 0) row = 0; int lastRow = TApp::instance()->getCurrentFrame()->getFrameIndex(); if (lastRow == row) return; @@ -1322,7 +1341,7 @@ public: app->getCurrentFrame()->scrubXsheet(row, row, getViewer()->getXsheet()); } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { getViewer()->getXsheet()->stopScrub(); } }; @@ -1354,14 +1373,16 @@ public: PlayRangeModifier(XsheetViewer *viewer) : DragTool(viewer), m_movingFirst(false) {} - void onClick(int row, int col) override { + void onClick(const CellPosition &pos) override { + int row = pos.frame(); XsheetGUI::getPlayRange(m_oldR0, m_oldR1, m_oldStep); assert(m_oldR0 == row || m_oldR1 == row); m_movingFirst = m_oldR0 == row; refreshRowsArea(); } - void onDrag(int row, int col) override { + void onDrag(const CellPosition &pos) override { + int row = pos.frame(); if (row < 0) row = 0; onRowChange(row); refreshRowsArea(); @@ -1391,7 +1412,8 @@ public: XsheetGUI::setPlayRange(r0, r1, step, false); } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { + int row = pos.frame(); int newR0, newR1, newStep; XsheetGUI::getPlayRange(newR0, newR1, newStep); if (m_oldR0 != newR0 || m_oldR1 != newR1) { @@ -1428,7 +1450,8 @@ public: void onClick(const QMouseEvent *event) override { TColumnSelection *selection = getViewer()->getColumnSelection(); - int col = getViewer()->xToColumn(event->pos().x()); + CellPosition cellPosition = getViewer()->xyToPosition(event->pos()); + int col = cellPosition.layer(); m_firstColumn = col; bool isSelected = selection->isColumnSelected(col); if (event->modifiers() & Qt::ControlModifier) { @@ -1453,7 +1476,8 @@ public: getViewer()->update(); } - void onDrag(int row, int col) override { + void onDrag(const CellPosition &pos) override { + int col = pos.layer(); if (!m_enabled) return; if (col < 0) return; TColumnSelection *selection = getViewer()->getColumnSelection(); @@ -1465,7 +1489,7 @@ public: refreshCellsArea(); return; } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { TSelectionHandle::getCurrent()->notifySelectionChanged(); } }; @@ -1559,7 +1583,8 @@ public: , m_lastCol(-1) , m_offset(0) {} - void onClick(int row, int col) override { + void onClick(const CellPosition &pos) override { + int col = pos.layer(); TColumnSelection *selection = getViewer()->getColumnSelection(); if (!selection->isColumnSelected(col)) { selection->selectNone(); @@ -1574,7 +1599,8 @@ public: assert(m_lastCol == *indices.begin()); getViewer()->update(); } - void onDrag(int row, int col) override { + void onDrag(const CellPosition &pos) override { + int col = pos.layer(); TColumnSelection *selection = getViewer()->getColumnSelection(); std::set indices = selection->getIndices(); if (indices.empty()) return; @@ -1595,7 +1621,7 @@ public: ++it) selection->selectColumn(*it + dCol, true); } - void onRelease(int row, int col) override { + void onRelease(const CellPosition &pos) override { int delta = m_lastCol - m_firstCol; if (delta == 0) return; TColumnSelection *selection = getViewer()->getColumnSelection(); @@ -1657,9 +1683,11 @@ public: ChangePegbarParentDragTool(XsheetViewer *viewer) : XsheetGUI::DragTool(viewer), m_firstCol(-1), m_lastCol(-1) {} - void onClick(int row, int col) override { m_firstCol = m_lastCol = col; } - void onDrag(int row, int col) override { m_lastCol = col; } - void onRelease(int row, int col) override { + void onClick(const CellPosition &pos) override { + m_firstCol = m_lastCol = pos.layer(); + } + void onDrag(const CellPosition &pos) override { m_lastCol = pos.layer(); } + void onRelease(const CellPosition &pos) override { // TUndoManager::manager()->add(new ColumnMoveUndo(indices, delta)); TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); TStageObjectId columnId(getViewer()->getObjectId(m_firstCol)); @@ -1732,9 +1760,14 @@ public: void onDrag(const QMouseEvent *event) override { if (!m_enabled) return; - double v = - (double)(60 - (event->pos().y() - (XsheetGUI::RowHeight * 2 + 4))) / - 60.0; + + const Orientation *o = getViewer()->orientation(); + QRect track = o->rect(PredefinedRect::VOLUME_TRACK); + NumberRange range = o->frameSide(track); + int frameAxis = o->frameAxis(event->pos()); + double v = range.ratio(frameAxis); + if (o->flipVolume()) v = 1 - v; + TXsheet *xsh = getViewer()->getXsheet(); TXshColumn *column = xsh->getColumn(m_index); if (!column) return; @@ -1782,7 +1815,8 @@ public: , m_oldRow(0) , m_timerId(0) {} - void onClick(int row, int col) override { + void onClick(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); TColumnSelection *selection = getViewer()->getColumnSelection(); selection->selectNone(); m_startRow = row; @@ -1790,7 +1824,10 @@ public: getViewer()->updateCells(); } - void onDrag(int row, int col) override { onCellChange(row, col); } + void onDrag(const CellPosition &pos) override { + int row = pos.frame(), col = pos.layer(); + onCellChange(row, col); + } void onCellChange(int row, int col) { assert(m_startRow >= 0); @@ -1798,9 +1835,9 @@ public: getViewer()->updateCells(); } - void onRelease(int row, int col) override { - int r0 = std::min(row, m_startRow); - int r1 = std::max(row, m_startRow); + void onRelease(const CellPosition &pos) override { + int r0 = std::min(pos.frame(), m_startRow); + int r1 = std::max(pos.frame(), m_startRow); assert(m_soundColumn); TApp *app = TApp::instance(); ToonzScene *scene = app->getCurrentScene()->getScene(); @@ -1870,7 +1907,7 @@ enum CellMovementType { NO_MOVEMENT, INSERT_CELLS, OVERWRITE_CELLS }; class DataDragTool final : public XsheetGUI::DragTool { DragAndDropData *m_data; bool m_valid; - TPoint m_curPos; + TPoint m_curPos; // screen xy of drag begin CellMovementType m_type; protected: @@ -1928,8 +1965,9 @@ public: } void onDrag(const QDropEvent *e) override { TPoint pos(e->pos().x(), e->pos().y()); - int row = getViewer()->yToRow(pos.y); - int col = getViewer()->xToColumn(pos.x); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); m_valid = true; if (e->keyboardModifiers() & Qt::ShiftModifier) @@ -1943,8 +1981,9 @@ public: } void onRelease(const QDropEvent *e) override { TPoint pos(e->pos().x(), e->pos().y()); - int row = getViewer()->yToRow(pos.y); - int col = getViewer()->xToColumn(pos.x); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); if (m_type != NO_MOVEMENT && !m_valid) return; bool insert = m_type == INSERT_CELLS; @@ -1973,24 +2012,23 @@ public: refreshCellsArea(); } void drawCellsArea(QPainter &p) override { - TPoint pos(getViewer()->xToColumn(m_curPos.x), - getViewer()->yToRow(m_curPos.y)); - TRect rect = m_data->getLevelFrameRect(); + CellPosition beginDragPosition = getViewer()->xyToPosition(m_curPos); + TPoint pos(beginDragPosition.layer(), + beginDragPosition.frame()); // row and cell coordinates + TRect rect = m_data->getLevelFrameRect(); // row and cell coordinates if (rect.isEmpty()) return; rect += pos; if (rect.x1 < 0 || rect.y1 < 0) return; if (rect.x0 < 0) rect.x0 = 0; if (rect.y0 < 0) rect.y0 = 0; - int x0, y0, x1, y1; - x0 = getViewer()->columnToX(rect.x0); - x1 = getViewer()->columnToX(rect.x1 + 1); - y0 = getViewer()->rowToY(rect.y0); - y1 = getViewer()->rowToY(rect.y1 + 1); - int x = x1 - x0; - int y = y1 - y0; + QRect screenCell = getViewer()->rangeToXYRect( + CellRange(CellPosition(rect.y0, rect.x0), + CellPosition(rect.y1 + 1, rect.x1 + 1))); p.setPen(m_valid ? QColor(190, 220, 255) : QColor(255, 0, 0)); int i; - for (i = 0; i < 3; i++) p.drawRect(x0 + i, y0 + i, x - 2 * i, y - 2 * i); + for (i = 0; i < 3; i++) // thick border within cell + p.drawRect(QRect(screenCell.topLeft() + QPoint(i, i), + screenCell.size() - QSize(2 * i, 2 * i))); } }; diff --git a/toonz/sources/toonz/xsheetdragtool.h b/toonz/sources/toonz/xsheetdragtool.h index c2cef5c..e01c892 100644 --- a/toonz/sources/toonz/xsheetdragtool.h +++ b/toonz/sources/toonz/xsheetdragtool.h @@ -4,6 +4,7 @@ #define XSHEET_DRAG_TOOL_H #include "tgeometry.h" +#include "cellposition.h" // forward declaration class QPainter; @@ -28,9 +29,9 @@ public: void refreshRowsArea(); void refreshColumnsArea(); - virtual void onClick(int row, int col) {} - virtual void onDrag(int row, int col) {} - virtual void onRelease(int row, int col) {} + virtual void onClick(const CellPosition &pos) {} + virtual void onDrag(const CellPosition &pos) {} + virtual void onRelease(const CellPosition &pos) {} virtual void onClick(const QMouseEvent *event); virtual void onDrag(const QMouseEvent *event); diff --git a/toonz/sources/toonz/xsheetviewer.cpp b/toonz/sources/toonz/xsheetviewer.cpp index a8debfc..b34eeb9 100644 --- a/toonz/sources/toonz/xsheetviewer.cpp +++ b/toonz/sources/toonz/xsheetviewer.cpp @@ -48,8 +48,10 @@ TEnv::IntVar FrameDisplayStyleInXsheetRowArea( namespace XsheetGUI { //----------------------------------------------------------------------------- -const int ColumnWidth = 74; -const int RowHeight = 20; +const int ColumnWidth = 74; +const int RowHeight = 20; +const int SCROLLBAR_WIDTH = 16; +const int TOOLBAR_HEIGHT = 30; } // namespace XsheetGUI @@ -139,14 +141,6 @@ XsheetViewer::XsheetViewer(QWidget *parent, Qt::WindowFlags flags) XsheetViewer::XsheetViewer(QWidget *parent, Qt::WFlags flags) #endif : QFrame(parent) - , m_x0(XsheetGUI::ColumnWidth + 1) -#ifndef LINETEST - , m_y0(XsheetGUI::RowHeight * 3 + - 60) // Per tab il numero delle righe era 8 perche c'e' il linkBox -#else - , m_y0(XsheetGUI::RowHeight * 8 + - 5) // Per tab il numero delle righe era 8 perche c'e' il linkBox -#endif , m_timerId(0) , m_autoPanSpeed(0, 0) , m_dragTool(0) @@ -161,28 +155,33 @@ XsheetViewer::XsheetViewer(QWidget *parent, Qt::WFlags flags) , m_isComputingSize(false) , m_currentNoteIndex(0) , m_qtModifiers(0) - , m_toolbarHeight(30) - , m_frameDisplayStyle(to_enum(FrameDisplayStyleInXsheetRowArea)) { + , m_frameDisplayStyle(to_enum(FrameDisplayStyleInXsheetRowArea)) + , m_orientation(nullptr) { + setFocusPolicy(Qt::StrongFocus); setFrameStyle(QFrame::StyledPanel); setObjectName("XsheetViewer"); + m_orientation = Orientations::topToBottom(); + m_cellKeyframeSelection->setXsheetHandle( TApp::instance()->getCurrentXsheet()); m_toolbarScrollArea = new XsheetScrollArea(this); - m_toolbarScrollArea->setFixedSize(m_x0 * 12, m_toolbarHeight); + m_toolbarScrollArea->setFixedSize(m_orientation->cellWidth() * 12, + XsheetGUI::TOOLBAR_HEIGHT); m_toolbarScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_toolbarScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_toolbar = new XsheetGUI::Toolbar(this); - m_toolbar->setFixedSize(m_x0 * 12, m_toolbarHeight); + m_toolbar->setFixedSize(m_orientation->cellWidth() * 12, + XsheetGUI::TOOLBAR_HEIGHT); m_toolbarScrollArea->setWidget(m_toolbar); - m_noteArea = new XsheetGUI::NoteArea(this); - m_noteArea->setFixedSize(m_x0 + 1, m_y0 - 3); + QRect noteArea(0, 0, 75, 120); + m_noteArea = new XsheetGUI::NoteArea(this); m_noteScrollArea = new XsheetScrollArea(this); - m_noteScrollArea->setFixedSize(m_x0 + 1, m_y0 - 3); + m_noteScrollArea->setObjectName("xsheetArea"); m_noteScrollArea->setWidget(m_noteArea); m_noteScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_noteScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -193,8 +192,6 @@ XsheetViewer::XsheetViewer(QWidget *parent, Qt::WFlags flags) m_cellScrollArea->setWidget(m_cellArea); m_cellScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); m_cellScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - // m_cellScrollArea->horizontalScrollBar()->setObjectName("XsheetScrollBar"); - // m_cellScrollArea->verticalScrollBar()->setObjectName("XsheetScrollBar"); m_columnArea = new XsheetGUI::ColumnArea(this); m_columnScrollArea = new XsheetScrollArea(this); @@ -210,19 +207,16 @@ XsheetViewer::XsheetViewer(QWidget *parent, Qt::WFlags flags) m_rowScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_rowScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - connect(m_rowScrollArea->verticalScrollBar(), SIGNAL(valueChanged(int)), - m_cellScrollArea->verticalScrollBar(), SLOT(setValue(int))); - connect(m_cellScrollArea->verticalScrollBar(), SIGNAL(valueChanged(int)), - m_rowScrollArea->verticalScrollBar(), SLOT(setValue(int))); - connect(m_columnScrollArea->horizontalScrollBar(), SIGNAL(valueChanged(int)), - m_cellScrollArea->horizontalScrollBar(), SLOT(setValue(int))); - connect(m_cellScrollArea->horizontalScrollBar(), SIGNAL(valueChanged(int)), - m_columnScrollArea->horizontalScrollBar(), SLOT(setValue(int))); + m_frameScroller.setFrameScrollArea(m_cellScrollArea); + connect(&m_frameScroller, &Spreadsheet::FrameScroller::prepareToScrollOffset, + this, &XsheetViewer::onPrepareToScrollOffset); + + connectScrollBars(); + + connect(this, &XsheetViewer::orientationChanged, this, + &XsheetViewer::onOrientationChanged); - connect(m_cellScrollArea->verticalScrollBar(), SIGNAL(valueChanged(int)), - SLOT(updateCellRowAree())); - connect(m_cellScrollArea->horizontalScrollBar(), SIGNAL(valueChanged(int)), - SLOT(updateCellColumnAree())); + emit orientationChanged(orientation()); } //----------------------------------------------------------------------------- @@ -284,6 +278,116 @@ void XsheetViewer::dragToolLeave(QEvent *e) { //----------------------------------------------------------------------------- +const Orientation *XsheetViewer::orientation() const { + if (!m_orientation) throw std::runtime_error("!m_orientation"); + return m_orientation; +} + +void XsheetViewer::flipOrientation() { + m_orientation = orientation()->next(); + emit orientationChanged(orientation()); +} + +void XsheetViewer::onOrientationChanged(const Orientation *newOrientation) { + disconnectScrollBars(); + + positionSections(); + m_frameScroller.setOrientation(newOrientation); + refreshContentSize(0, 0); + + connectScrollBars(); + + update(); +} + +void XsheetViewer::positionSections() { + const Orientation *o = orientation(); + QRect size = QRect(QPoint(0, 0), geometry().size()); + NumberRange allLayer = o->layerSide(size); + NumberRange allFrame = o->frameSide(size); + + NumberRange headerLayer = o->range(PredefinedRange::HEADER_LAYER); + NumberRange headerFrame = o->range(PredefinedRange::HEADER_FRAME); + NumberRange bodyLayer(headerLayer.to(), allLayer.to()); + NumberRange bodyFrame(headerFrame.to(), allFrame.to()); + + if (Preferences::instance()->isShowXSheetToolbarEnabled()) { + m_toolbar->showToolbar(true); + + int w = geometry().size().width(); + m_toolbarScrollArea->setGeometry(0, 0, w, XsheetGUI::TOOLBAR_HEIGHT); + + if (o->isVerticalTimeline()) { + headerFrame = headerFrame.adjusted(XsheetGUI::TOOLBAR_HEIGHT, + XsheetGUI::TOOLBAR_HEIGHT); + bodyFrame = bodyFrame.adjusted(XsheetGUI::TOOLBAR_HEIGHT, 0); + } else { + headerLayer = headerLayer.adjusted(XsheetGUI::TOOLBAR_HEIGHT, + XsheetGUI::TOOLBAR_HEIGHT); + bodyLayer = bodyLayer.adjusted(XsheetGUI::TOOLBAR_HEIGHT, 0); + } + } else { + m_toolbar->showToolbar(false); + } + + m_noteScrollArea->setGeometry(o->frameLayerRect(headerFrame, headerLayer)); + m_cellScrollArea->setGeometry(o->frameLayerRect(bodyFrame, bodyLayer)); + m_columnScrollArea->setGeometry( + o->frameLayerRect(headerFrame.adjusted(-1, -1), + bodyLayer.adjusted(0, -XsheetGUI::SCROLLBAR_WIDTH))); + m_rowScrollArea->setGeometry(o->frameLayerRect( + bodyFrame.adjusted(0, -XsheetGUI::SCROLLBAR_WIDTH), headerLayer)); +} + +void XsheetViewer::disconnectScrollBars() { + connectOrDisconnectScrollBars(false); +} +void XsheetViewer::connectScrollBars() { connectOrDisconnectScrollBars(true); } + +void XsheetViewer::connectOrDisconnectScrollBars(bool toConnect) { + const Orientation *o = orientation(); + bool isVertical = o->isVerticalTimeline(); + QWidget *scrolledVertically = + (isVertical ? m_rowScrollArea : m_columnScrollArea)->verticalScrollBar(); + QWidget *scrolledHorizontally = + (isVertical ? m_columnScrollArea : m_rowScrollArea) + ->horizontalScrollBar(); + + connectOrDisconnect(toConnect, scrolledVertically, SIGNAL(valueChanged(int)), + m_cellScrollArea->verticalScrollBar(), + SLOT(setValue(int))); + connectOrDisconnect(toConnect, m_cellScrollArea->verticalScrollBar(), + SIGNAL(valueChanged(int)), scrolledVertically, + SLOT(setValue(int))); + + connectOrDisconnect( + toConnect, scrolledHorizontally, SIGNAL(valueChanged(int)), + m_cellScrollArea->horizontalScrollBar(), SLOT(setValue(int))); + connectOrDisconnect(toConnect, m_cellScrollArea->horizontalScrollBar(), + SIGNAL(valueChanged(int)), scrolledHorizontally, + SLOT(setValue(int))); + + connectOrDisconnect( + toConnect, m_cellScrollArea->verticalScrollBar(), + SIGNAL(valueChanged(int)), this, + isVertical ? SLOT(updateCellRowAree()) : SLOT(updateCellColumnAree())); + connectOrDisconnect( + toConnect, m_cellScrollArea->horizontalScrollBar(), + SIGNAL(valueChanged(int)), this, + isVertical ? SLOT(updateCellColumnAree()) : SLOT(updateCellRowAree())); +} + +void XsheetViewer::connectOrDisconnect(bool toConnect, QWidget *sender, + const char *signal, QWidget *receiver, + const char *slot) { + if (toConnect) + connect(sender, signal, receiver, slot); + else + disconnect(sender, signal, receiver, slot); +} + +//----------------------------------------------------------------------------- + TXsheet *XsheetViewer::getXsheet() const { return TApp::instance()->getCurrentXsheet()->getXsheet(); } @@ -361,7 +465,6 @@ frameHandle->setFrame(row);*/ void XsheetViewer::scroll(QPoint delta) { int x = delta.x(); int y = delta.y(); - prepareToScroll(y); int valueH = m_cellScrollArea->horizontalScrollBar()->value() + x; int valueV = m_cellScrollArea->verticalScrollBar()->value() + y; @@ -391,7 +494,9 @@ void XsheetViewer::scroll(QPoint delta) { //----------------------------------------------------------------------------- -void XsheetViewer::onPrepareToScroll(int dy) { refreshContentSize(0, dy); } +void XsheetViewer::onPrepareToScrollOffset(const QPoint &offset) { + refreshContentSize(offset.x(), offset.y()); +} //----------------------------------------------------------------------------- @@ -445,18 +550,20 @@ void XsheetViewer::timerEvent(QTimerEvent *) { //----------------------------------------------------------------------------- +// adjust sizes after scrolling event bool XsheetViewer::refreshContentSize(int dx, int dy) { QSize viewportSize = m_cellScrollArea->viewport()->size(); QPoint offset = m_cellArea->pos(); - offset = QPoint(qMin(0, offset.x() - dx), qMin(0, offset.y() - dy)); + offset = QPoint(qMin(0, offset.x() - dx), qMin(0, offset.y() - dy)); // what? TXsheet *xsh = getXsheet(); int frameCount = xsh ? xsh->getFrameCount() : 0; int columnCount = xsh ? xsh->getColumnCount() : 0; - QSize contentSize(columnToX(columnCount + 1), rowToY(frameCount + 1)); + QPoint contentSize = + positionToXY(CellPosition(frameCount + 1, columnCount + 1)); - QSize actualSize(contentSize); - int x = viewportSize.width() - offset.x(); + QSize actualSize(contentSize.x(), contentSize.y()); + int x = viewportSize.width() - offset.x(); // wtf is going on int y = viewportSize.height() - offset.y(); if (x > actualSize.width()) actualSize.setWidth(x); if (y > actualSize.height()) actualSize.setHeight(y); @@ -464,10 +571,17 @@ bool XsheetViewer::refreshContentSize(int dx, int dy) { if (actualSize == m_cellArea->size()) return false; else { + const Orientation *o = orientation(); + NumberRange allLayer = o->layerSide(QRect(QPoint(0, 0), actualSize)); + NumberRange allFrame = o->frameSide(QRect(QPoint(0, 0), actualSize)); + NumberRange headerLayer = o->range(PredefinedRange::HEADER_LAYER); + NumberRange headerFrame = o->range(PredefinedRange::HEADER_FRAME); + m_isComputingSize = true; + m_noteArea->setFixedSize(o->rect(PredefinedRect::NOTE_AREA).size()); m_cellArea->setFixedSize(actualSize); - m_rowArea->setFixedSize(m_x0, actualSize.height()); - m_columnArea->setFixedSize(actualSize.width(), m_y0); + m_rowArea->setFixedSize(o->frameLayerRect(allFrame, headerLayer).size()); + m_columnArea->setFixedSize(o->frameLayerRect(headerFrame, allLayer).size()); m_isComputingSize = false; return true; } @@ -475,43 +589,92 @@ bool XsheetViewer::refreshContentSize(int dx, int dy) { //----------------------------------------------------------------------------- +// call when in doubt void XsheetViewer::updateAreeSize() { - int w = m_cellScrollArea->width() - 15; - int h = m_cellScrollArea->height() - 15; + const Orientation *o = orientation(); + QRect viewArea(QPoint(0, 0), m_cellScrollArea->geometry() + .adjusted(0, 0, -XsheetGUI::SCROLLBAR_WIDTH, + -XsheetGUI::SCROLLBAR_WIDTH) + .size()); - TXsheet *xsh = getXsheet(); - int frameCount = xsh ? xsh->getFrameCount() : 0; - int hCounted = (XsheetGUI::RowHeight) * (frameCount + 1); - if (h < hCounted) h = hCounted; + QPoint areaFilled(0, 0); + TXsheet *xsh = getXsheet(); + if (xsh) + areaFilled = positionToXY( + CellPosition(xsh->getFrameCount() + 1, xsh->getColumnCount() + 1)); + if (viewArea.right() < areaFilled.x()) viewArea.setRight(areaFilled.x()); + if (viewArea.bottom() < areaFilled.y()) viewArea.setBottom(areaFilled.y()); - int columnCount = xsh ? xsh->getColumnCount() : 0; - int wCounted = (XsheetGUI::ColumnWidth) * (columnCount + 1); - if (w < wCounted) w = wCounted; + NumberRange allLayer = o->layerSide(viewArea); + NumberRange allFrame = o->frameSide(viewArea); + NumberRange headerLayer = o->range(PredefinedRange::HEADER_LAYER); + NumberRange headerFrame = o->range(PredefinedRange::HEADER_FRAME); - m_cellArea->setFixedSize(w, h); - m_rowArea->setFixedSize(m_x0, h); - m_columnArea->setFixedSize(w, m_y0); + m_cellArea->setFixedSize(viewArea.size()); + m_rowArea->setFixedSize(o->frameLayerRect(allFrame, headerLayer).size()); + m_columnArea->setFixedSize(o->frameLayerRect(headerFrame, allLayer).size()); } //----------------------------------------------------------------------------- -int XsheetViewer::xToColumn(int x) const { - return getXsheet()->getColumnFan()->xToCol(x); +CellPosition XsheetViewer::xyToPosition(const QPoint &point) const { + const Orientation *o = orientation(); + return o->xyToPosition(point, getXsheet()->getColumnFan(o)); +} +CellPosition XsheetViewer::xyToPosition(const TPoint &point) const { + return xyToPosition(QPoint(point.x, point.y)); +} +CellPosition XsheetViewer::xyToPosition(const TPointD &point) const { + return xyToPosition(QPoint((int)point.x, (int)point.y)); } //----------------------------------------------------------------------------- -int XsheetViewer::yToRow(int y) const { return y / XsheetGUI::RowHeight; } +QPoint XsheetViewer::positionToXY(const CellPosition &pos) const { + const Orientation *o = orientation(); + return o->positionToXY(pos, getXsheet()->getColumnFan(o)); +} + +int XsheetViewer::columnToLayerAxis(int layer) const { + const Orientation *o = orientation(); + return o->colToLayerAxis(layer, getXsheet()->getColumnFan(o)); +} +int XsheetViewer::rowToFrameAxis(int frame) const { + return orientation()->rowToFrameAxis(frame); +} + +//----------------------------------------------------------------------------- + +CellRange XsheetViewer::xyRectToRange(const QRect &rect) const { + CellPosition topLeft = xyToPosition(rect.topLeft()); + CellPosition bottomRight = xyToPosition(rect.bottomRight()); + return CellRange(topLeft, bottomRight); +} //----------------------------------------------------------------------------- -int XsheetViewer::columnToX(int col) const { - return getXsheet()->getColumnFan()->colToX(col); +QRect XsheetViewer::rangeToXYRect(const CellRange &range) const { + QPoint from = positionToXY(range.from()); + QPoint to = positionToXY(range.to()); + QPoint topLeft = QPoint(min(from.x(), to.x()), min(from.y(), to.y())); + QPoint bottomRight = QPoint(max(from.x(), to.x()), max(from.y(), to.y())); + return QRect(topLeft, bottomRight); } //----------------------------------------------------------------------------- -int XsheetViewer::rowToY(int row) const { return row * XsheetGUI::RowHeight; } +void XsheetViewer::drawPredefinedPath(QPainter &p, PredefinedPath which, + const CellPosition &pos, + optional fill, + optional outline) const { + QPoint xy = positionToXY(pos); + QPainterPath path = orientation()->path(which).translated(xy); + if (fill) p.fillPath(path, QBrush(*fill)); + if (outline) { + p.setPen(*outline); + p.drawPath(path); + } +} //----------------------------------------------------------------------------- @@ -590,7 +753,7 @@ bool XsheetViewer::isScrubHighlighted(int row, int col) { //----------------------------------------------------------------------------- void XsheetViewer::showEvent(QShowEvent *) { - registerFrameScroller(); + m_frameScroller.registerFrameScroller(); if (m_isCurrentFrameSwitched) onCurrentFrameSwitched(); if (m_isCurrentColumnSwitched) onCurrentColumnSwitched(); m_isCurrentFrameSwitched = false; @@ -651,7 +814,7 @@ void XsheetViewer::showEvent(QShowEvent *) { //----------------------------------------------------------------------------- void XsheetViewer::hideEvent(QHideEvent *) { - unregisterFrameScroller(); + m_frameScroller.unregisterFrameScroller(); TApp *app = TApp::instance(); @@ -704,39 +867,13 @@ void XsheetViewer::paintEvent(QPaintEvent*) //----------------------------------------------------------------------------- -void XsheetViewer::updatePanelsSizes() { - int w = width(); - int h = height(); - int scrollBarWidth = 16; - if (Preferences::instance()->isShowXSheetToolbarEnabled()) { - m_toolbar->showToolbar(true); - m_toolbarScrollArea->setGeometry(1, 1, m_x0 * 12, m_y0 - 3); - m_noteScrollArea->setGeometry(3, m_toolbarHeight + 1, m_x0 - 4, m_y0 - 3); - m_cellScrollArea->setGeometry(m_x0, m_y0 + m_toolbarHeight, w - m_x0, - h - m_y0 - m_toolbarHeight); - m_columnScrollArea->setGeometry(m_x0, m_toolbarHeight + 1, - w - m_x0 - scrollBarWidth, m_y0 - 3); - m_rowScrollArea->setGeometry(1, m_y0 + m_toolbarHeight, m_x0 - 1, - h - m_y0 - scrollBarWidth - m_toolbarHeight); - } else { - m_toolbar->showToolbar(false); - m_toolbarScrollArea->setGeometry(3, 1, m_x0 - 4, m_y0 - 3); - m_noteScrollArea->setGeometry(3, 1, m_x0 - 4, m_y0 - 3); - m_cellScrollArea->setGeometry(m_x0, m_y0, w - m_x0, h - m_y0); - m_columnScrollArea->setGeometry(m_x0, 1, w - m_x0 - scrollBarWidth, - m_y0 - 3); - m_rowScrollArea->setGeometry(1, m_y0, m_x0 - 1, h - m_y0 - scrollBarWidth); - } -} - -//----------------------------------------------------------------------------- - void XsheetViewer::resizeEvent(QResizeEvent *event) { - updatePanelsSizes(); - //(Nuovo Layout Manager) Reintrodotto per il refresh automatico + positionSections(); + + //(New Layout Manager) introduced automatic refresh refreshContentSize( 0, - 0); // Non updateAreeSize() perche' si deve tener conto degli scrollbar. + 0); // Don't updateAreeSize because you have to account scrollbars updateAllAree(); } @@ -751,13 +888,16 @@ void XsheetViewer::wheelEvent(QWheelEvent *event) { ->getScene() ->getProperties() ->getMarkers(markerDistance, markerOffset); + if (event->angleDelta().x() == 0) { // vertical scroll + if (!orientation()->isVerticalTimeline()) markerDistance = 1; int scrollPixels = (event->angleDelta().y() > 0 ? 1 : -1) * - markerDistance * XsheetGUI::RowHeight; + markerDistance * orientation()->cellHeight(); scroll(QPoint(0, -scrollPixels)); } else { // horizontal scroll - int scrollPixels = - (event->angleDelta().x() > 0 ? 1 : -1) * XsheetGUI::ColumnWidth; + if (orientation()->isVerticalTimeline()) markerDistance = 1; + int scrollPixels = (event->angleDelta().x() > 0 ? 1 : -1) * + markerDistance * orientation()->cellWidth(); scroll(QPoint(-scrollPixels, 0)); } break; @@ -806,9 +946,10 @@ void XsheetViewer::keyPressEvent(QKeyEvent *event) { if (changeFrameSkippingHolds(event)) return; int frameCount = getXsheet()->getFrameCount(); - int row = getCurrentRow(), col = getCurrentColumn(); + CellPosition now(getCurrentRow(), getCurrentColumn()); + CellPosition shift = orientation()->arrowShift(event->key()); + CellPosition stride(1, 1); // stride in row and column axes - int rowStride = 1; TCellSelection *cellSel = dynamic_cast(TSelection::getCurrent()); // Use arrow keys to shift the cell selection. Ctrl + arrow keys to resize the @@ -817,77 +958,63 @@ void XsheetViewer::keyPressEvent(QKeyEvent *event) { cellSel && !cellSel->isEmpty()) { int r0, c0, r1, c1; cellSel->getSelectedCells(r0, c0, r1, c1); - rowStride = cellSel->getSelectedCells().getRowCount(); - QPoint offset(0, 0); - switch (int key = event->key()) { - case Qt::Key_Up: - offset.setY(-1); - break; - case Qt::Key_Down: - offset.setY(1); - break; - case Qt::Key_Left: - offset.setX(-1); - break; - case Qt::Key_Right: - offset.setX(1); - break; - } - if (m_cellArea->isControlPressed()) { - if (r0 == r1 && offset.y() == -1) return; - if (c0 == c1 && offset.x() == -1) return; - cellSel->selectCells(r0, c0, r1 + offset.y(), c1 + offset.x()); + stride.setFrame(cellSel->getSelectedCells().getRowCount()); + + if (m_cellArea->isControlPressed()) { // resize + if (r0 == r1 && shift.frame() < 0) return; + if (c0 == c1 && shift.layer() < 0) return; + cellSel->selectCells(r0, c0, r1 + shift.frame(), c1 + shift.layer()); updateCells(); TApp::instance()->getCurrentSelection()->notifySelectionChanged(); return; - } else { - offset.setY(offset.y() * rowStride); - if (r0 + offset.y() < 0) offset.setY(-r0); - if (c0 + offset.x() < 0) return; - cellSel->selectCells(r0 + offset.y(), c0 + offset.x(), r1 + offset.y(), - c1 + offset.x()); + } else { // shift + CellPosition offset(shift * stride); + int movedR0 = std::max(0, r0 + offset.frame()); + int movedC0 = std::max(0, c0 + offset.layer()); + int diffFrame = movedR0 - r0; + int diffLayer = movedC0 - c0; + cellSel->selectCells(r0 + diffFrame, c0 + diffLayer, r1 + diffFrame, + c1 + diffLayer); TApp::instance()->getCurrentSelection()->notifySelectionChanged(); } } + if (shift) { + now = now + shift * stride; + now.ensureValid(); + setCurrentRow(now.frame()); + setCurrentColumn(now.layer()); + return; + } + switch (int key = event->key()) { - case Qt::Key_Up: - setCurrentRow(std::max(row - rowStride, 0)); - break; - case Qt::Key_Down: - setCurrentRow(row + rowStride); - break; - case Qt::Key_Left: - setCurrentColumn(std::max(col - 1, 0)); - break; - case Qt::Key_Right: - setCurrentColumn(col + 1); - break; case Qt::Key_Control: // display the upper-directional smart tab only when the ctrl key is pressed m_cellArea->onControlPressed(true); + m_columnArea->onControlPressed(true); break; default: { QRect visibleRect = m_cellArea->visibleRegion().boundingRect(); - int visibleRowCount = visibleRect.height() / XsheetGUI::RowHeight; + int visibleRowCount = visibleRect.height() / orientation()->cellHeight(); switch (key) { case Qt::Key_PageUp: locals.scrollTo( - visibleRect.top() - visibleRowCount * XsheetGUI::RowHeight, + visibleRect.top() - visibleRowCount * orientation()->cellHeight(), visibleRect); break; case Qt::Key_PageDown: locals.scrollTo( - visibleRect.bottom() + visibleRowCount * XsheetGUI::RowHeight, + visibleRect.bottom() + visibleRowCount * orientation()->cellHeight(), visibleRect); break; case Qt::Key_Home: locals.scrollTo(0, visibleRect); break; case Qt::Key_End: - locals.scrollTo((frameCount + 1) * XsheetGUI::RowHeight, visibleRect); + locals.scrollTo((frameCount + 1) * orientation()->cellHeight(), + visibleRect); break; } break; @@ -898,18 +1025,25 @@ void XsheetViewer::keyPressEvent(QKeyEvent *event) { //----------------------------------------------------------------------------- // display the upper-directional smart tab only when the ctrl key is pressed void XsheetViewer::keyReleaseEvent(QKeyEvent *event) { - if (event->key() == Qt::Key_Control) m_cellArea->onControlPressed(false); + if (event->key() == Qt::Key_Control) { + m_cellArea->onControlPressed(false); + m_columnArea->onControlPressed(false); + } } -void XsheetViewer::enterEvent(QEvent *) { m_cellArea->onControlPressed(false); } +void XsheetViewer::enterEvent(QEvent *) { + m_cellArea->onControlPressed(false); + m_columnArea->onControlPressed(false); +} //----------------------------------------------------------------------------- /*! scroll the cell area to make a cell at (row,col) visible */ void XsheetViewer::scrollTo(int row, int col) { QRect visibleRect = m_cellArea->visibleRegion().boundingRect(); - QRect cellRect(columnToX(col), rowToY(row), XsheetGUI::ColumnWidth, - XsheetGUI::RowHeight); + QPoint topLeft = positionToXY(CellPosition(row, col)); + QRect cellRect( + topLeft, QSize(orientation()->cellWidth(), orientation()->cellHeight())); int deltaX = 0; int deltaY = 0; @@ -949,7 +1083,10 @@ void XsheetViewer::onXsheetChanged() { //----------------------------------------------------------------------------- void XsheetViewer::onPreferenceChanged(const QString &prefName) { - if (prefName == "XSheetToolbar") updatePanelsSizes(); + if (prefName == "XSheetToolbar") { + positionSections(); + refreshContentSize(0, 0); + } } //----------------------------------------------------------------------------- @@ -988,50 +1125,63 @@ void XsheetViewer::onCurrentColumnSwitched() { //----------------------------------------------------------------------------- void XsheetViewer::scrollToColumn(int col) { - int x0 = columnToX(col); - int x1 = columnToX(col + 1); + int x0 = columnToLayerAxis(col); + int x1 = columnToLayerAxis(col + 1); - scrollToHorizontalRange(x0, x1); + if (orientation()->isVerticalTimeline()) + scrollToHorizontalRange(x0, x1); + else + scrollToVerticalRange(x0, x1); } //----------------------------------------------------------------------------- void XsheetViewer::scrollToHorizontalRange(int x0, int x1) { QRect visibleRect = m_cellArea->visibleRegion().boundingRect(); - int visibleLeft = visibleRect.left(); - int visibleRight = visibleRect.right(); + if (visibleRect.isEmpty()) return; + int visibleLeft = visibleRect.left(); + int visibleRight = visibleRect.right(); - if (visibleLeft > x1) { // Se sono fuori dalla regione visibile in alto + if (visibleLeft > x0) { // If they are out of left visible region int deltaX = x0 - visibleLeft; scroll(QPoint(deltaX, 0)); return; } - if (visibleRight < x1) { // Se sono fuori dalla regione visibile in basso + if (visibleRight < x1) { // If they are out of right visible region int deltaX = x1 + 2 - visibleRight; scroll(QPoint(deltaX, 0)); return; } - updateCellColumnAree(); + if (orientation()->isVerticalTimeline()) + updateCellColumnAree(); + else + updateCellRowAree(); } //----------------------------------------------------------------------------- void XsheetViewer::scrollToRow(int row) { - int y0 = rowToY(row); - int y1 = rowToY(row + 1); + int y0 = rowToFrameAxis(row); + int y1 = rowToFrameAxis(row + 1); - scrollToVerticalRange(y0, y1); + if (orientation()->isVerticalTimeline()) + scrollToVerticalRange(y0, y1); + else + scrollToHorizontalRange(y0, y1); } //----------------------------------------------------------------------------- void XsheetViewer::scrollToVerticalRange(int y0, int y1) { + int yMin = min(y0, y1); + int yMax = max(y0, y1); QRect visibleRect = m_cellArea->visibleRegion().boundingRect(); + if (visibleRect.isEmpty()) return; int visibleTop = visibleRect.top(); int visibleBottom = visibleRect.bottom(); - if (visibleTop > y0) { // Se sono fuori dalla regione visibile in alto - int deltaY = y0 - visibleTop; + if (visibleTop > yMin) { // If they are out of top visible region + int deltaY = yMin - visibleTop; if (!TApp::instance()->getCurrentFrame()->isPlaying() || Preferences::instance()->isXsheetAutopanEnabled()) { scroll(QPoint(0, deltaY)); @@ -1039,16 +1189,18 @@ void XsheetViewer::scrollToVerticalRange(int y0, int y1) { } } - if (visibleBottom < y1) { // Se sono fuori dalla regione visibile in basso - int deltaY = y1 + 2 - visibleBottom; + if (visibleBottom < yMax) { // If they are out of bottom visible region + int deltaY = yMax + 2 - visibleBottom; if (!TApp::instance()->getCurrentFrame()->isPlaying() || Preferences::instance()->isXsheetAutopanEnabled()) { scroll(QPoint(0, deltaY)); return; } } - m_rowArea->update(m_rowArea->visibleRegion()); - m_cellArea->update(m_cellArea->visibleRegion()); + if (orientation()->isVerticalTimeline()) + updateCellRowAree(); + else + updateCellColumnAree(); } //----------------------------------------------------------------------------- @@ -1089,6 +1241,7 @@ void XsheetViewer::updateAllAree(bool isDragging) { m_rowArea->update(m_rowArea->visibleRegion()); m_columnArea->update(m_columnArea->visibleRegion()); } + m_toolbar->update(m_toolbar->visibleRegion()); } //----------------------------------------------------------------------------- @@ -1166,12 +1319,12 @@ void XsheetViewer::setCurrentNoteIndex(int currentNoteIndex) { int col = notes->getNoteCol(currentNoteIndex); TPointD pos = notes->getNotePos(currentNoteIndex); - int x0 = columnToX(col) + pos.x; - int x1 = x0 + XsheetGUI::NoteWidth; - scrollToHorizontalRange(x0, x1); - int y0 = rowToY(row) + pos.y; - int y1 = y0 + XsheetGUI::NoteHeight; - scrollToVerticalRange(y0, y1); + QPoint topLeft = positionToXY(CellPosition(row, col)) + + QPoint(pos.x, pos.y); // actually xy + QSize size(XsheetGUI::NoteWidth, XsheetGUI::NoteHeight); + QRect noteRect(topLeft, size); + scrollToHorizontalRange(noteRect.left(), noteRect.right()); + scrollToVerticalRange(noteRect.top(), noteRect.bottom()); } //----------------------------------------------------------------------------- @@ -1296,6 +1449,19 @@ void XsheetViewer::setFrameDisplayStyle(FrameDisplayStyle style) { } //----------------------------------------------------------------------------- + +void XsheetViewer::save(QSettings &settings) const { + settings.setValue("orientation", orientation()->name()); +} +void XsheetViewer::load(QSettings &settings) { + QVariant name = settings.value("orientation"); + if (!name.canConvert(QVariant::String)) return; + + m_orientation = Orientations::byName(name.toString()); + emit orientationChanged(orientation()); +} + +//----------------------------------------------------------------------------- /* TPanel *createXsheetViewer(QWidget *parent) { diff --git a/toonz/sources/toonz/xsheetviewer.h b/toonz/sources/toonz/xsheetviewer.h index d1eb9e4..7a8238c 100644 --- a/toonz/sources/toonz/xsheetviewer.h +++ b/toonz/sources/toonz/xsheetviewer.h @@ -12,7 +12,12 @@ #include "xshnoteviewer.h" #include "xshtoolbar.h" #include "cellkeyframeselection.h" +#include "saveloadqsettings.h" #include "toonzqt/spreadsheetviewer.h" +#include "orientation.h" +#include + +using boost::optional; #define XSHEET_FONT_PX_SIZE 12 #define H_ADJUST 2 @@ -150,7 +155,7 @@ protected: //! Note: some refactoring is needed. XsheetViewer is going to derive from //! SpreadsheetViewer. -class XsheetViewer final : public QFrame, public Spreadsheet::FrameScroller { +class XsheetViewer final : public QFrame, public SaveLoadQSettings { Q_OBJECT QColor m_lightLightBgColor; @@ -322,7 +327,8 @@ class XsheetViewer final : public QFrame, public Spreadsheet::FrameScroller { XsheetGUI::NoteArea *m_noteArea; XsheetGUI::Toolbar *m_toolbar; - int m_x0, m_y0, m_toolbarHeight; + Spreadsheet::FrameScroller m_frameScroller; + int m_timerId; QPoint m_autoPanSpeed; QPoint m_lastAutoPanPos; @@ -344,6 +350,8 @@ class XsheetViewer final : public QFrame, public Spreadsheet::FrameScroller { Qt::KeyboardModifiers m_qtModifiers; + const Orientation *m_orientation; + public: enum FrameDisplayStyle { Frame = 0, SecAndFrame, SixSecSheet, ThreeSecSheet }; @@ -417,7 +425,6 @@ public: void setCurrentRow(int row); void scroll(QPoint delta); - void onPrepareToScroll(int dy) override; void setAutoPanSpeed(const QPoint &speed); void setAutoPanSpeed(const QRect &widgetBounds, const QPoint &mousePos); @@ -426,22 +433,33 @@ public: return m_autoPanSpeed.x() != 0 || m_autoPanSpeed.y() != 0; } - int xToColumn(int x) const; - int yToRow(int y) const; - int columnToX(int col) const; - int rowToY(int row) const; + //------- + const Orientation *orientation() const; + void flipOrientation(); + + CellPosition xyToPosition(const QPoint &point) const; + CellPosition xyToPosition(const TPoint &point) const; + CellPosition xyToPosition(const TPointD &point) const; + QPoint positionToXY(const CellPosition &pos) const; + + int columnToLayerAxis(int layer) const; + int rowToFrameAxis(int frame) const; + + CellRange xyRectToRange(const QRect &rect) const; + QRect rangeToXYRect(const CellRange &range) const; + + void drawPredefinedPath(QPainter &p, PredefinedPath which, + const CellPosition &pos, optional fill, + optional outline) const; + //--------- void updateCells() { m_cellArea->update(m_cellArea->visibleRegion()); } void updateRows() { m_rowArea->update(m_rowArea->visibleRegion()); } void updateColumns() { m_columnArea->update(m_columnArea->visibleRegion()); } - void updatePanelsSizes(); bool refreshContentSize(int scrollDx, int scrollDy); void updateAreeSize(); - // provvisorio - QScrollArea *getFrameScrollArea() const override { return m_cellScrollArea; } - QList getNotesWidget() const; void addNoteWidget(XsheetGUI::NoteWidget *w); int getCurrentNoteIndex() const; @@ -660,6 +678,10 @@ public: void setFrameDisplayStyle(FrameDisplayStyle style); FrameDisplayStyle getFrameDisplayStyle() { return m_frameDisplayStyle; } + // SaveLoadQSettings + virtual void save(QSettings &settings) const override; + virtual void load(QSettings &settings) override; + protected: void scrollToColumn(int col); void scrollToHorizontalRange(int x0, int x1); @@ -676,6 +698,15 @@ protected: void wheelEvent(QWheelEvent *event) override; void timerEvent(QTimerEvent *) override; + void positionSections(); + void disconnectScrollBars(); + void connectScrollBars(); + void connectOrDisconnectScrollBars(bool toConnect); + void connectOrDisconnect(bool toConnect, QWidget *sender, const char *signal, + QWidget *receiver, const char *slot); +signals: + void orientationChanged(const Orientation *newOrientation); + public slots: void onSceneSwitched(); void onXsheetChanged(); @@ -697,6 +728,9 @@ public slots: void changeWindowTitle(); void resetXsheetNotes(); + + void onOrientationChanged(const Orientation *newOrientation); + void onPrepareToScrollOffset(const QPoint &offset); }; #endif // XSHEETVIEWER_H diff --git a/toonz/sources/toonz/xshnoteviewer.cpp b/toonz/sources/toonz/xshnoteviewer.cpp index 3805bf4..95df06d 100644 --- a/toonz/sources/toonz/xshnoteviewer.cpp +++ b/toonz/sources/toonz/xshnoteviewer.cpp @@ -14,6 +14,7 @@ #include "toonz/txshnoteset.h" #include "toonz/sceneproperties.h" #include "toonz/txsheethandle.h" +#include "orientation.h" // Qt includes #include @@ -372,7 +373,7 @@ NoteWidget::NoteWidget(XsheetViewer *parent, int noteIndex) void NoteWidget::paint(QPainter *painter, QPoint pos, bool isCurrent) { painter->translate(pos); - QRect rect(0, 0, width(), height()); + QRect rect = m_viewer->orientation()->rect(PredefinedRect::NOTE_ICON); TXshNoteSet *notes = m_viewer->getXsheet()->getNotes(); TSceneProperties *sp = m_viewer->getXsheet()->getScene()->getProperties(); @@ -450,37 +451,52 @@ NoteArea::NoteArea(XsheetViewer *parent, Qt::WindowFlags flags) #else NoteArea::NoteArea(XsheetViewer *parent, Qt::WFlags flags) #endif - : QFrame(parent), m_viewer(parent) { + : QFrame(parent) + , m_viewer(parent) + , m_flipOrientationButton(nullptr) + , m_noteButton(nullptr) + , m_precNoteButton(nullptr) + , m_nextNoteButton(nullptr) + , m_frameDisplayStyleCombo(nullptr) + , m_layerHeaderPanel(nullptr) { + setFrameStyle(QFrame::StyledPanel); setObjectName("cornerWidget"); - QToolButton *toolButton = new QToolButton(this); + m_flipOrientationButton = + new QPushButton(m_viewer->orientation()->name(), this); + m_noteButton = new QToolButton(this); m_precNoteButton = new QToolButton(this); m_nextNoteButton = new QToolButton(this); m_frameDisplayStyleCombo = new QComboBox(this); + m_layerHeaderPanel = new LayerHeaderPanel(m_viewer, this); + //----- - toolButton->setObjectName("ToolbarToolButton"); - toolButton->setFixedSize(44, 26); - toolButton->setIconSize(QSize(38, 20)); + m_flipOrientationButton->setObjectName("flipOrientationButton"); + m_flipOrientationButton->setFocusPolicy(Qt::FocusPolicy::NoFocus); + + m_noteButton->setObjectName("ToolbarToolButton"); + m_noteButton->setFixedSize(44, 26); + m_noteButton->setIconSize(QSize(38, 20)); QIcon addNoteIcon = createQIconPNG("newmemo"); - addNoteIcon.addFile(QString(":Resources/newmemo_disabled.png"), QSize(), + addNoteIcon.addFile(QString(":Resources/newmemo_disabled.svg"), QSize(), QIcon::Disabled); - toolButton->setIcon(addNoteIcon); + m_noteButton->setIcon(addNoteIcon); m_precNoteButton->setObjectName("ToolbarToolButton"); m_precNoteButton->setFixedSize(22, 22); - m_precNoteButton->setIconSize(QSize(15, 23)); - QIcon precNoteIcon = createQIconPNG("prevkey"); - precNoteIcon.addFile(QString(":Resources/prevkey_disabled.png"), QSize(), + m_precNoteButton->setIconSize(QSize(17, 17)); + QIcon precNoteIcon = createQIcon("prevkey"); + precNoteIcon.addFile(QString(":Resources/prevkey_disabled.svg"), QSize(), QIcon::Disabled); m_precNoteButton->setIcon(precNoteIcon); m_nextNoteButton->setObjectName("ToolbarToolButton"); m_nextNoteButton->setFixedSize(22, 22); - m_nextNoteButton->setIconSize(QSize(15, 23)); - QIcon nextNoteIcon = createQIconPNG("nextkey"); - nextNoteIcon.addFile(QString(":Resources/nextkey_disabled.png"), QSize(), + m_nextNoteButton->setIconSize(QSize(17, 17)); + QIcon nextNoteIcon = createQIcon("nextkey"); + nextNoteIcon.addFile(QString(":Resources/nextkey_disabled.svg"), QSize(), QIcon::Disabled); m_nextNoteButton->setIcon(nextNoteIcon); @@ -492,35 +508,14 @@ NoteArea::NoteArea(XsheetViewer *parent, Qt::WFlags flags) (int)m_viewer->getFrameDisplayStyle()); // layout - QVBoxLayout *mainLay = new QVBoxLayout(); - mainLay->setMargin(0); - mainLay->setSpacing(5); - { - mainLay->addStretch(1); - - mainLay->addWidget(toolButton, 0, Qt::AlignHCenter); - - QHBoxLayout *noteLay = new QHBoxLayout(); - noteLay->setMargin(0); - noteLay->setSpacing(0); - { - noteLay->addStretch(1); - noteLay->addWidget(m_precNoteButton, 0); - noteLay->addWidget(m_nextNoteButton, 0); - noteLay->addStretch(1); - } - mainLay->addLayout(noteLay, 0); - - mainLay->addStretch(1); - - mainLay->addWidget(m_frameDisplayStyleCombo, 0); - } - setLayout(mainLay); + createLayout(); // signal-slot connections bool ret = true; + ret = ret && connect(m_flipOrientationButton, SIGNAL(clicked()), + SLOT(flipOrientation())); - ret = ret && connect(toolButton, SIGNAL(clicked()), SLOT(toggleNewNote())); + ret = ret && connect(m_noteButton, SIGNAL(clicked()), SLOT(toggleNewNote())); ret = ret && connect(m_precNoteButton, SIGNAL(clicked()), this, SLOT(precNote())); ret = ret && @@ -530,6 +525,9 @@ NoteArea::NoteArea(XsheetViewer *parent, Qt::WFlags flags) ret && connect(m_frameDisplayStyleCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onFrameDisplayStyleChanged(int))); + ret = ret && connect(m_viewer, &XsheetViewer::orientationChanged, this, + &NoteArea::onXsheetOrientationChanged); + updateButtons(); assert(ret); @@ -537,6 +535,69 @@ NoteArea::NoteArea(XsheetViewer *parent, Qt::WFlags flags) //----------------------------------------------------------------------------- +void NoteArea::removeLayout() { + QLayout *currentLayout = layout(); + if (!currentLayout) return; + + currentLayout->removeWidget(m_flipOrientationButton); + currentLayout->removeWidget(m_noteButton); + currentLayout->removeWidget(m_precNoteButton); + currentLayout->removeWidget(m_nextNoteButton); + currentLayout->removeWidget(m_frameDisplayStyleCombo); + currentLayout->removeWidget(m_layerHeaderPanel); + delete currentLayout; +} + +void NoteArea::createLayout() { + const Orientation *o = m_viewer->orientation(); + QRect rect = o->rect(PredefinedRect::NOTE_AREA); + + setFixedSize(rect.size()); + + // has two elements: main layout and header panel + QVBoxLayout *panelLayout = new QVBoxLayout(); + panelLayout->setMargin(1); + panelLayout->setSpacing(0); + { + QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::Direction( + o->dimension(PredefinedDimension::QBOXLAYOUT_DIRECTION))); + Qt::AlignmentFlag centerAlign = + Qt::AlignmentFlag(o->dimension(PredefinedDimension::CENTER_ALIGN)); + mainLayout->setMargin(1); + mainLayout->setSpacing(0); + { + mainLayout->addWidget(m_flipOrientationButton, 0, centerAlign); + + mainLayout->addStretch(1); + + mainLayout->addWidget(m_noteButton, 0, centerAlign); + + QHBoxLayout *buttonsLayout = new QHBoxLayout(); + buttonsLayout->setMargin(0); + buttonsLayout->setSpacing(0); + { + buttonsLayout->addStretch(1); + buttonsLayout->addWidget(m_precNoteButton, 0); + buttonsLayout->addWidget(m_nextNoteButton, 0); + buttonsLayout->addStretch(1); + } + mainLayout->addLayout(buttonsLayout, 0); + + mainLayout->addStretch(1); + + mainLayout->addWidget(m_frameDisplayStyleCombo, 0); + } + panelLayout->addLayout(mainLayout); + + panelLayout->addWidget(m_layerHeaderPanel); + } + setLayout(panelLayout); + + m_layerHeaderPanel->showOrHide(o); +} + +//----------------------------------------------------------------------------- + void NoteArea::updateButtons() { TXshNoteSet *notes = m_viewer->getXsheet()->getNotes(); @@ -555,6 +616,16 @@ void NoteArea::updateButtons() { //----------------------------------------------------------------------------- +void NoteArea::flipOrientation() { m_viewer->flipOrientation(); } + +void NoteArea::onXsheetOrientationChanged(const Orientation *newOrientation) { + m_flipOrientationButton->setText(newOrientation->caption()); + removeLayout(); + createLayout(); +} + +//----------------------------------------------------------------------------- + void NoteArea::toggleNewNote() { if (!m_newNotePopup) m_newNotePopup.reset(new XsheetGUI::NotePopup(m_viewer, -1)); diff --git a/toonz/sources/toonz/xshnoteviewer.h b/toonz/sources/toonz/xshnoteviewer.h index d2d4cc4..7de096a 100644 --- a/toonz/sources/toonz/xshnoteviewer.h +++ b/toonz/sources/toonz/xshnoteviewer.h @@ -13,6 +13,8 @@ #include #include +#include "layerheaderpanel.h" + //----------------------------------------------------------------------------- // forward declaration @@ -22,6 +24,7 @@ class TColorStyle; class QToolButton; class QPushButton; class QComboBox; +class Orientation; //----------------------------------------------------------------------------- @@ -117,11 +120,16 @@ class NoteArea final : public QFrame { std::unique_ptr m_newNotePopup; // Popup used to create new note XsheetViewer *m_viewer; + QPushButton *m_flipOrientationButton; + + QToolButton *m_noteButton; QToolButton *m_nextNoteButton; QToolButton *m_precNoteButton; QComboBox *m_frameDisplayStyleCombo; + LayerHeaderPanel *m_layerHeaderPanel; + public: #if QT_VERSION >= 0x050500 NoteArea(XsheetViewer *parent = 0, Qt::WindowFlags flags = 0); @@ -133,11 +141,17 @@ public: void updateButtons(); protected slots: + void flipOrientation(); void toggleNewNote(); void nextNote(); void precNote(); void onFrameDisplayStyleChanged(int id); + void onXsheetOrientationChanged(const Orientation *orientation); + +protected: + void removeLayout(); + void createLayout(); }; } // namespace XsheetGUI; diff --git a/toonz/sources/toonz/xshrowviewer.cpp b/toonz/sources/toonz/xshrowviewer.cpp index 53e8913..fe323d9 100644 --- a/toonz/sources/toonz/xshrowviewer.cpp +++ b/toonz/sources/toonz/xshrowviewer.cpp @@ -46,7 +46,6 @@ RowArea::RowArea(XsheetViewer *parent, Qt::WFlags flags) #endif : QWidget(parent, flags) , m_viewer(parent) - , m_xa(ColumnWidth / 2 - 12) , m_row(-1) , m_showOnionToSet(None) , m_pos(-1, -1) @@ -108,20 +107,23 @@ void RowArea::drawRows(QPainter &p, int r0, int r1) { QRect visibleRect = visibleRegion().boundingRect(); - int x0 = visibleRect.left(); - int x1 = visibleRect.right(); - int y0 = visibleRect.top(); - int y1 = visibleRect.bottom(); + int x0 = visibleRect.left(); + int x1 = visibleRect.right(); + int y0 = visibleRect.top(); + int y1 = visibleRect.bottom(); + NumberRange layerSide = m_viewer->orientation()->layerSide(visibleRect); for (int r = r0; r <= r1; r++) { - int y = m_viewer->rowToY(r); + int frameAxis = m_viewer->rowToFrameAxis(r); //--- draw horizontal line - QColor color = ((r - offset) % distance != 0) - ? m_viewer->getLightLineColor() - : m_viewer->getMarkerLineColor(); + QColor color = ((r - offset) % distance == 0 && r != 0) + ? m_viewer->getMarkerLineColor() + : m_viewer->getLightLineColor(); p.setPen(color); - p.drawLine(x0, y, x1, y); + QLine horizontalLine = + m_viewer->orientation()->horizontalLine(frameAxis, layerSide); + p.drawLine(horizontalLine); // draw frame text if (playR0 <= r && r <= playR1) { @@ -132,6 +134,13 @@ void RowArea::drawRows(QPainter &p, int r0, int r1) { else p.setPen(m_viewer->getTextColor()); + QPoint basePoint = m_viewer->positionToXY(CellPosition(r, 0)); + QRect labelRect = m_viewer->orientation() + ->rect(PredefinedRect::FRAME_LABEL) + .translated(basePoint); + int align = m_viewer->orientation()->dimension( + PredefinedDimension::FRAME_LABEL_ALIGN); + // display time and/or frame number switch (m_viewer->getFrameDisplayStyle()) { case XsheetViewer::SecAndFrame: { int frameRate = TApp::instance() @@ -152,16 +161,14 @@ void RowArea::drawRows(QPainter &p, int r0, int r1) { str = QString("%1\"").arg(QString::number(koma).rightJustified(2, '0')); } - p.drawText(QRect(width() / 2 - 15, y + 1, width() / 2 + 7, RowHeight - 2), - Qt::AlignRight | Qt::AlignBottom, str); + p.drawText(labelRect, align, str); break; } case XsheetViewer::Frame: { QString number = QString::number(r + 1); - p.drawText(QRect(width() / 2 - 2, y + 1, width() / 2, RowHeight - 2), - Qt::AlignHCenter | Qt::AlignBottom, number); + p.drawText(labelRect, align, number); break; } @@ -177,15 +184,14 @@ void RowArea::drawRows(QPainter &p, int r0, int r1) { int koma = (r + 1) % (frameRate * 6); if ((r + 1) % frameRate == 1) { int page = (r + 1) / (frameRate * 6) + 1; - str = QString("p%1 %2") + str = QString("p%1 %2") .arg(QString::number(page)) .arg(QString::number(koma).rightJustified(3, '0')); } else { if (koma == 0) koma = frameRate * 6; str = QString("%1").arg(QString::number(koma).rightJustified(3, '0')); } - p.drawText(QRect(width() / 2 - 21, y + 1, width() / 2 + 7, RowHeight - 2), - Qt::AlignRight | Qt::AlignBottom, str); + p.drawText(labelRect, align, str); break; } // 3 second sheet (72frames per page) @@ -200,25 +206,18 @@ void RowArea::drawRows(QPainter &p, int r0, int r1) { int koma = (r + 1) % (frameRate * 3); if ((r + 1) % frameRate == 1) { int page = (r + 1) / (frameRate * 3) + 1; - str = QString("p%1 %2") + str = QString("p%1 %2") .arg(QString::number(page)) .arg(QString::number(koma).rightJustified(2, '0')); } else { if (koma == 0) koma = frameRate * 3; str = QString("%1").arg(QString::number(koma).rightJustified(2, '0')); } - p.drawText(QRect(width() / 2 - 21, y + 1, width() / 2 + 7, RowHeight - 2), - Qt::AlignRight | Qt::AlignBottom, str); + p.drawText(labelRect, align, str); break; } } } - - // hide the top-most horizontal line - if (r0 == 0) { - p.setPen(m_viewer->getLightLineColor()); - p.drawLine(x0, m_viewer->rowToY(0), x1, m_viewer->rowToY(0)); - } } //----------------------------------------------------------------------------- @@ -243,28 +242,29 @@ void RowArea::drawPlayRange(QPainter &p, int r0, int r1) { QColor ArrowColor = (playRangeEnabled) ? QColor(255, 255, 255) : grey150; p.setBrush(QBrush(ArrowColor)); - if (m_r0 > r0 - 1 && r1 + 1 > m_r0) { - int y0 = m_viewer->rowToY(m_r0); - drawArrow(p, QPointF(m_xa, y0 + 1), QPointF(m_xa + 10, y0 + 1), - QPointF(m_xa, y0 + 11), true, ArrowColor); - } + if (m_r0 > r0 - 1 && r1 + 1 > m_r0) + m_viewer->drawPredefinedPath(p, PredefinedPath::BEGIN_PLAY_RANGE, + CellPosition(m_r0, 0), ArrowColor, + QColor(Qt::black)); - if (m_r1 > r0 - 1 && r1 + 1 > m_r1) { - int y1 = m_viewer->rowToY(m_r1 + 1) - 12; - drawArrow(p, QPointF(m_xa, y1 + 1), QPointF(m_xa + 10, y1 + 11), - QPointF(m_xa, y1 + 11), true, ArrowColor); - } + if (m_r1 > r0 - 1 && r1 + 1 > m_r1) + m_viewer->drawPredefinedPath(p, PredefinedPath::END_PLAY_RANGE, + CellPosition(m_r1, 0), ArrowColor, + QColor(Qt::black)); } //----------------------------------------------------------------------------- void RowArea::drawCurrentRowGadget(QPainter &p, int r0, int r1) { int currentRow = m_viewer->getCurrentRow(); - int y = m_viewer->rowToY(currentRow); if (currentRow < r0 || r1 < currentRow) return; - p.fillRect(1, y + 1, width() - 4, RowHeight - 1, - m_viewer->getCurrentRowBgColor()); + QPoint topLeft = m_viewer->positionToXY(CellPosition(currentRow, 0)); + QRect header = m_viewer->orientation() + ->rect(PredefinedRect::FRAME_HEADER) + .translated(topLeft) + .adjusted(1, 1, 0, 0); + p.fillRect(header, m_viewer->getCurrentRowBgColor()); } //----------------------------------------------------------------------------- @@ -285,10 +285,6 @@ void RowArea::drawOnionSkinSelection(QPainter &p) { 128); QColor backColor((int)backPixel.r, (int)backPixel.g, (int)backPixel.b, 128); - int onionDotDiam = 8; - int onionHandleDiam = RowHeight - 1; - int onionDotYPos = (RowHeight - onionDotDiam) / 2; - // If the onion skin is disabled, draw dash line instead. if (osMask.isEnabled()) p.setPen(Qt::red); @@ -299,14 +295,11 @@ void RowArea::drawOnionSkinSelection(QPainter &p) { p.setPen(currentPen); } - // Draw onion skin extender handles. - QRectF handleRect(3, m_viewer->rowToY(currentRow) + 1, onionHandleDiam, - onionHandleDiam); - int angle180 = 16 * 180; - p.setBrush(QBrush(backColor)); - p.drawChord(handleRect, 0, angle180); - p.setBrush(QBrush(frontColor)); - p.drawChord(handleRect, angle180, angle180); + QRect onionRect = m_viewer->orientation()->rect(PredefinedRect::ONION); + int onionCenter_frame = + m_viewer->orientation()->frameSide(onionRect).middle(); + int onionCenter_layer = + m_viewer->orientation()->layerSide(onionRect).middle(); //-- draw movable onions @@ -322,18 +315,47 @@ void RowArea::drawOnionSkinSelection(QPainter &p) { p.setBrush(Qt::NoBrush); if (minMos < 0) // previous frames { - int y0 = - m_viewer->rowToY(currentRow + minMos) + onionDotYPos + onionDotDiam; - int y1 = m_viewer->rowToY(currentRow); - p.drawLine(onionDotDiam * 1.5, y0, onionDotDiam * 1.5, y1); + int layerAxis = onionCenter_layer; + int fromFrameAxis = + m_viewer->rowToFrameAxis(currentRow + minMos) + onionCenter_frame; + int toFrameAxis = m_viewer->rowToFrameAxis(currentRow) + onionCenter_frame; + QLine verticalLine = m_viewer->orientation()->verticalLine( + layerAxis, NumberRange(fromFrameAxis, toFrameAxis)); + if (m_viewer->orientation()->isVerticalTimeline()) + p.drawLine(verticalLine.x1() + 1, verticalLine.y1() + 4, + verticalLine.x2() + 1, verticalLine.y2() - 10); + else + p.drawLine(verticalLine.x1() + 4, verticalLine.y1() + 1, + verticalLine.x2() - 10, verticalLine.y2() + 1); } - if (maxMos > 0) // foward frames + if (maxMos > 0) // forward frames { - int y0 = m_viewer->rowToY(currentRow + 1); - int y1 = m_viewer->rowToY(currentRow + maxMos) + onionDotYPos; - p.drawLine(onionDotDiam * 1.5, y0, onionDotDiam * 1.5, y1); + int layerAxis = onionCenter_layer; + int fromFrameAxis = + m_viewer->rowToFrameAxis(currentRow) + onionCenter_frame; + int toFrameAxis = + m_viewer->rowToFrameAxis(currentRow + maxMos) + onionCenter_frame; + QLine verticalLine = m_viewer->orientation()->verticalLine( + layerAxis, NumberRange(fromFrameAxis, toFrameAxis)); + if (m_viewer->orientation()->isVerticalTimeline()) + p.drawLine(verticalLine.x1() + 1, verticalLine.y1() + 10, + verticalLine.x2() + 1, verticalLine.y2() - 4); + else + p.drawLine(verticalLine.x1() + 10, verticalLine.y1() + 1, + verticalLine.x2() - 4, verticalLine.y2() + 1); } + // Draw onion skin main handle + QPoint handleTopLeft = m_viewer->positionToXY(CellPosition(currentRow, 0)); + QRect handleRect = onionRect.translated(handleTopLeft); + int angle180 = 16 * 180; + int turn = + m_viewer->orientation()->dimension(PredefinedDimension::ONION_TURN) * 16; + p.setBrush(QBrush(backColor)); + p.drawChord(handleRect, turn, angle180); + p.setBrush(QBrush(frontColor)); + p.drawChord(handleRect, turn + angle180, angle180); + // draw onion skin dots p.setPen(Qt::red); for (int i = 0; i < mosCount; i++) { @@ -341,13 +363,16 @@ void RowArea::drawOnionSkinSelection(QPainter &p) { int mos = osMask.getMos(i); // skip drawing if the frame is under the mouse cursor if (m_showOnionToSet == Mos && currentRow + mos == m_row) continue; - int y = m_viewer->rowToY(currentRow + mos) + onionDotYPos; if (osMask.isEnabled()) p.setBrush(mos < 0 ? backColor : frontColor); else p.setBrush(Qt::NoBrush); - p.drawEllipse(onionDotDiam, y, onionDotDiam, onionDotDiam); + QPoint topLeft = m_viewer->positionToXY(CellPosition(currentRow + mos, 0)); + QRect dotRect = m_viewer->orientation() + ->rect(PredefinedRect::ONION_DOT) + .translated(topLeft); + p.drawEllipse(dotRect); } //-- draw fixed onions @@ -356,22 +381,29 @@ void RowArea::drawOnionSkinSelection(QPainter &p) { if (fos == currentRow) continue; // skip drawing if the frame is under the mouse cursor if (m_showOnionToSet == Fos && fos == m_row) continue; - int y = m_viewer->rowToY(fos) + onionDotYPos; if (osMask.isEnabled()) p.setBrush(QBrush(QColor(0, 255, 255, 128))); else p.setBrush(Qt::NoBrush); - p.drawEllipse(0, y, onionDotDiam, onionDotDiam); + QPoint topLeft = m_viewer->positionToXY(CellPosition(fos, 0)); + QRect dotRect = m_viewer->orientation() + ->rect(PredefinedRect::ONION_DOT_FIXED) + .translated(topLeft); + p.drawEllipse(dotRect); } - //-- draw highlighted onion + //-- onion placement hint under mouse if (m_showOnionToSet != None) { - int y = m_viewer->rowToY(m_row) + onionDotYPos; - int xPos = (m_showOnionToSet == Fos) ? 0 : onionDotDiam; p.setPen(QColor(255, 128, 0)); - p.setBrush(QBrush(QColor(255, 255, 0, 200))); - p.drawEllipse(xPos, y, onionDotDiam, onionDotDiam); + p.setBrush(QBrush(QColor(255, 255, 0))); + QPoint topLeft = m_viewer->positionToXY(CellPosition(m_row, 0)); + QRect dotRect = + m_viewer->orientation() + ->rect(m_showOnionToSet == Fos ? PredefinedRect::ONION_DOT_FIXED + : PredefinedRect::ONION_DOT) + .translated(topLeft); + p.drawEllipse(dotRect); } } @@ -416,7 +448,8 @@ void RowArea::drawPinnedCenterKeys(QPainter &p, int r0, int r1) { int columnCount = xsh->getColumnCount(); int prev_pinnedCol = -2; - QRect keyRect(30, 5, 10, 10); + QRect keyRect = + m_viewer->orientation()->rect(PredefinedRect::PINNED_CENTER_KEY); p.setPen(Qt::black); r1 = (r1 < xsh->getFrameCount() - 1) ? xsh->getFrameCount() - 1 : r1; @@ -430,21 +463,22 @@ void RowArea::drawPinnedCenterKeys(QPainter &p, int r0, int r1) { if (tmp_pinnedCol != prev_pinnedCol) { prev_pinnedCol = tmp_pinnedCol; if (r != r0 - 1) { - if (m_pos.x() >= 30 && m_pos.x() <= 40 && m_row == r) + QPoint mouseInCell = m_pos - m_viewer->positionToXY(CellPosition(r, 0)); + if (keyRect.contains(mouseInCell)) p.setBrush(QColor(30, 210, 255)); else p.setBrush(QColor(0, 175, 255)); - int y = m_viewer->rowToY(r); - QRect tmpKeyRect = keyRect.translated(0, y); - p.drawRect(tmpKeyRect); + QPoint topLeft = m_viewer->positionToXY(CellPosition(r, 0)); + QRect adjusted = keyRect.translated(topLeft); + p.drawRect(adjusted); QFont font = p.font(); font.setPixelSize(8); font.setBold(false); p.setFont(font); p.drawText( - tmpKeyRect, Qt::AlignCenter, + adjusted, Qt::AlignCenter, QString::number((tmp_pinnedCol == -1) ? ancestorId.getIndex() + 1 : tmp_pinnedCol + 1)); } @@ -459,9 +493,10 @@ void RowArea::paintEvent(QPaintEvent *event) { QPainter p(this); - int r0, r1; // range di righe visibili - r0 = m_viewer->yToRow(toBeUpdated.top()); - r1 = m_viewer->yToRow(toBeUpdated.bottom()); + CellRange cellRange = m_viewer->xyRectToRange(toBeUpdated); + int r0, r1; // range of visible rows + r0 = cellRange.from().frame(); + r1 = cellRange.to().frame(); p.setClipRect(toBeUpdated); @@ -487,6 +522,8 @@ void RowArea::paintEvent(QPaintEvent *event) { //----------------------------------------------------------------------------- void RowArea::mousePressEvent(QMouseEvent *event) { + const Orientation *o = m_viewer->orientation(); + m_viewer->setQtModifiers(event->modifiers()); if (event->button() == Qt::LeftButton) { bool frameAreaIsClicked = false; @@ -496,22 +533,28 @@ void RowArea::mousePressEvent(QMouseEvent *event) { TPoint pos(event->pos().x(), event->pos().y()); int currentFrame = TApp::instance()->getCurrentFrame()->getFrame(); - int row = m_viewer->yToRow(pos.y); + int row = m_viewer->xyToPosition(pos).frame(); + QPoint topLeft = m_viewer->positionToXY(CellPosition(row, 0)); + QPoint mouseInCell = event->pos() - topLeft; - int onionDotDiam = 8; if (Preferences::instance()->isOnionSkinEnabled() && - ((row == currentFrame && pos.x < RowHeight + 2) || - (pos.x < onionDotDiam * 2))) { + o->rect(PredefinedRect::ONION_AREA).contains(mouseInCell)) { if (row == currentFrame) { setDragTool( XsheetGUI::DragTool::makeCurrentFrameModifierTool(m_viewer)); frameAreaIsClicked = true; - } else if (pos.x <= onionDotDiam) + } else if (o->rect(PredefinedRect::ONION_FIXED_DOT_AREA) + .contains(mouseInCell)) setDragTool(XsheetGUI::DragTool::makeKeyOnionSkinMaskModifierTool( m_viewer, true)); - else + else if (o->rect(PredefinedRect::ONION_DOT_AREA).contains(mouseInCell)) setDragTool(XsheetGUI::DragTool::makeKeyOnionSkinMaskModifierTool( m_viewer, false)); + else { + setDragTool( + XsheetGUI::DragTool::makeCurrentFrameModifierTool(m_viewer)); + frameAreaIsClicked = true; + } } else { int playR0, playR1, step; XsheetGUI::getPlayRange(playR0, playR1, step); @@ -527,7 +570,7 @@ void RowArea::mousePressEvent(QMouseEvent *event) { setDragTool( XsheetGUI::DragTool::makeCurrentFrameModifierTool(m_viewer)); frameAreaIsClicked = true; - } else if (m_xa <= pos.x && pos.x <= m_xa + 10 && + } else if (o->rect(PredefinedRect::PLAY_RANGE).contains(mouseInCell) && (row == playR0 || row == playR1)) { if (!playRangeEnabled) XsheetGUI::setPlayRange(playR0, playR1, step); setDragTool(XsheetGUI::DragTool::makePlayRangeModifierTool(m_viewer)); @@ -566,24 +609,31 @@ void RowArea::mousePressEvent(QMouseEvent *event) { //----------------------------------------------------------------------------- void RowArea::mouseMoveEvent(QMouseEvent *event) { + const Orientation *o = m_viewer->orientation(); m_viewer->setQtModifiers(event->modifiers()); QPoint pos = event->pos(); // pan by middle-drag if (m_isPanning) { QPoint delta = m_pos - pos; - delta.setX(0); + if (o->isVerticalTimeline()) + delta.setX(0); + else + delta.setY(0); m_viewer->scroll(delta); return; } - m_row = m_viewer->yToRow(pos.y()); + m_row = m_viewer->xyToPosition(pos).frame(); int x = pos.x(); if ((event->buttons() & Qt::LeftButton) != 0 && !visibleRegion().contains(pos)) { QRect bounds = visibleRegion().boundingRect(); - m_viewer->setAutoPanSpeed(bounds, QPoint(bounds.left(), pos.y())); + if (o->isVerticalTimeline()) + m_viewer->setAutoPanSpeed(bounds, QPoint(bounds.left(), pos.y())); + else + m_viewer->setAutoPanSpeed(bounds, QPoint(pos.x(), bounds.top())); } else m_viewer->stopAutoPan(); @@ -596,14 +646,15 @@ void RowArea::mouseMoveEvent(QMouseEvent *event) { if (getDragTool()) return; int currentRow = TApp::instance()->getCurrentFrame()->getFrame(); - int row = m_viewer->yToRow(m_pos.y()); + int row = m_viewer->xyToPosition(m_pos).frame(); + QPoint mouseInCell = + event->pos() - m_viewer->positionToXY(CellPosition(row, 0)); if (row < 0) return; - // "decide" se mostrare la possibilita' di settare l'onion skin - if (Preferences::instance()->isOnionSkinEnabled()) { - int onionDotDiam = 8; - if (x <= onionDotDiam && row != currentRow) + // whether to show ability to set onion marks + if (Preferences::instance()->isOnionSkinEnabled() && row != currentRow) { + if (o->rect(PredefinedRect::ONION_FIXED_DOT_AREA).contains(mouseInCell)) m_showOnionToSet = Fos; - else if (x <= onionDotDiam * 2 && row != currentRow) + else if (o->rect(PredefinedRect::ONION_DOT_AREA).contains(mouseInCell)) m_showOnionToSet = Mos; } @@ -612,7 +663,7 @@ void RowArea::mouseMoveEvent(QMouseEvent *event) { bool isRootBonePinned; int pinnedCenterColumnId = -1; if (TApp::instance()->getCurrentTool()->getTool()->getName() == T_Skeleton && - x >= 30 && x <= 40) { + o->rect(PredefinedRect::PINNED_CENTER_KEY).contains(mouseInCell)) { int col = m_viewer->getCurrentColumn(); TXsheet *xsh = m_viewer->getXsheet(); if (col >= 0 && xsh && !xsh->isColumnEmpty(col)) { @@ -635,27 +686,27 @@ void RowArea::mouseMoveEvent(QMouseEvent *event) { update(); - int y0 = m_viewer->rowToY(m_r0); - int y1 = m_viewer->rowToY(m_r1 + 1) - 12; - QPolygon startArrow, endArrow; - startArrow << QPoint(m_xa, y0 + 1) << QPoint(m_xa + 10, y0 + 1) - << QPoint(m_xa, y0 + 11); - endArrow << QPoint(m_xa, y1 + 1) << QPoint(m_xa + 10, y1 + 11) - << QPoint(m_xa, y1 + 11); + QPoint base0 = m_viewer->positionToXY(CellPosition(m_r0, 0)); + QPoint base1 = m_viewer->positionToXY(CellPosition(m_r1, 0)); + QPainterPath startArrow = + o->path(PredefinedPath::BEGIN_PLAY_RANGE).translated(base0); + QPainterPath endArrow = + o->path(PredefinedPath::END_PLAY_RANGE).translated(base1); - if (startArrow.containsPoint(m_pos, Qt::OddEvenFill)) + if (startArrow.contains(m_pos)) m_tooltip = tr("Playback Start Marker"); - else if (endArrow.containsPoint(m_pos, Qt::OddEvenFill)) + else if (endArrow.contains(m_pos)) m_tooltip = tr("Playback End Marker"); else if (isOnPinnedCenterKey) m_tooltip = tr("Pinned Center : Col%1%2") .arg(pinnedCenterColumnId + 1) .arg((isRootBonePinned) ? " (Root)" : ""); else if (row == currentRow) { - if (Preferences::instance()->isOnionSkinEnabled() && x < RowHeight + 2) + if (Preferences::instance()->isOnionSkinEnabled() && + o->rect(PredefinedRect::ONION).contains(mouseInCell)) m_tooltip = tr("Double Click to Toggle Onion Skin"); else - m_tooltip = tr("Curren Frame"); + m_tooltip = tr("Current Frame"); } else if (m_showOnionToSet == Fos) m_tooltip = tr("Fixed Onion Skin Toggle"); else if (m_showOnionToSet == Mos) @@ -674,7 +725,7 @@ void RowArea::mouseReleaseEvent(QMouseEvent *event) { TPoint pos(event->pos().x(), event->pos().y()); - int row = m_viewer->yToRow(pos.y); + int row = m_viewer->xyToPosition(pos).frame(); if (m_playRangeActiveInMousePress && row == m_mousePressRow && (13 <= pos.x && pos.x <= 26 && (row == m_r0 || row == m_r1))) onRemoveMarkers(); @@ -756,11 +807,15 @@ int RowArea::getNonEmptyCell(int row, int column, Direction direction) { void RowArea::mouseDoubleClickEvent(QMouseEvent *event) { int currentFrame = TApp::instance()->getCurrentFrame()->getFrame(); - int row = m_viewer->yToRow(event->pos().y()); + int row = m_viewer->xyToPosition(event->pos()).frame(); + QPoint mouseInCell = + event->pos() - m_viewer->positionToXY(CellPosition(row, 0)); if (TApp::instance()->getCurrentFrame()->isEditingScene() && event->buttons() & Qt::LeftButton && Preferences::instance()->isOnionSkinEnabled() && row == currentFrame && - event->pos().x() < RowHeight + 2) { + m_viewer->orientation() + ->rect(PredefinedRect::ONION) + .contains(mouseInCell)) { TOnionSkinMaskHandle *osmh = TApp::instance()->getCurrentOnionSkin(); OnionSkinMask osm = osmh->getOnionSkinMask(); osm.enable(!osm.isEnabled()); diff --git a/toonz/sources/toonz/xshrowviewer.h b/toonz/sources/toonz/xshrowviewer.h index 53e1bdf..404c64d 100644 --- a/toonz/sources/toonz/xshrowviewer.h +++ b/toonz/sources/toonz/xshrowviewer.h @@ -21,7 +21,6 @@ class DragTool; class RowArea final : public QWidget { Q_OBJECT XsheetViewer *m_viewer; - int m_xa; int m_row; enum ShowOnionToSetFlag { diff --git a/toonz/sources/toonzfarm/tfarmcontroller/tfarmcontroller.cpp b/toonz/sources/toonzfarm/tfarmcontroller/tfarmcontroller.cpp index 7efb069..a1c038a 100644 --- a/toonz/sources/toonzfarm/tfarmcontroller/tfarmcontroller.cpp +++ b/toonz/sources/toonzfarm/tfarmcontroller/tfarmcontroller.cpp @@ -8,6 +8,8 @@ #include "tfilepath_io.h" #include "service.h" #include "tcli.h" +#include "tversion.h" +using namespace TVER; #include "tthreadmessage.h" #include "tthread.h" @@ -54,16 +56,29 @@ int inline STRICMP(const char *a, const char *b) { namespace { TFilePath getGlobalRoot() { + TVER::ToonzVersion tver; TFilePath rootDir; #ifdef _WIN32 - TFilePath name(L"SOFTWARE\\OpenToonz\\OpenToonz\\1.0\\FARMROOT"); + std::string regpath = "SOFTWARE\\" + tver.getAppName() + "\\" + + tver.getAppName() + "\\" + tver.getAppVersionString() + + "\\FARMROOT"; + TFilePath name(regpath); rootDir = TFilePath(TSystem::getSystemValue(name).toStdString()); #else - // Leggo la globalRoot da File txt - Tifstream is( - TFilePath("./OpenToonz_1.0.app/Contents/Resources/configfarmroot.txt")); +// Leggo la globalRoot da File txt +#ifdef MACOSX + // If MACOSX, change to MACOSX path + std::string unixpath = "./" + tver.getAppName() + "_" + + tver.getAppVersionString() + + ".app/Contents/Resources/configfarmroot.txt"; +#else + // set path to something suitable for most linux (Unix?) systems + std::string unixpath = "/etc/" + tver.getAppName() + "/opentoonz.conf"; +#endif + TFilePath name(unixpath); + Tifstream is(name); if (is) { char line[1024]; is.getline(line, 80); @@ -87,17 +102,29 @@ TFilePath getGlobalRoot() { //-------------------------------------------------------------------- TFilePath getLocalRoot() { + TVER::ToonzVersion tver; TFilePath lroot; #ifdef _WIN32 - TFilePath name(L"SOFTWARE\\OpenToonz\\OpenToonz\\1.0\\TOONZROOT"); +std: + string regpath = "SOFTWARE\\" + tver.getAppName() + "\\" + tver.getAppName() + + "\\" + tver.getAppVersionString() + "\\FARMROOT"; + TFilePath name(regpath); lroot = TFilePath(TSystem::getSystemValue(name).toStdString()) + TFilePath("toonzfarm"); #else - // Leggo la localRoot da File txt - - Tifstream is( - TFilePath("./OpenToonz_1.0.app/Contents/Resources/configfarmroot.txt")); +// Leggo la localRoot da File txt +#ifdef MACOSX + // If MACOSX, change to MACOSX path + std::string unixpath = "./" + tver.getAppName() + "_" + + tver.getAppVersionString() + + ".app/Contents/Resources/configfarmroot.txt"; +#else + // set path to something suitable for most linux (Unix?) systems + std::string unixpath = "/etc/" + tver.getAppName() + "/opentoonz.conf"; +#endif + TFilePath name(unixpath); + Tifstream is(name); if (is) { char line[1024]; is.getline(line, 80); @@ -212,7 +239,7 @@ public: TPersist *create() const override { return new CtrlFarmTask; } } Declaration("tfarmtask"); -} +} // namespace //------------------------------------------------------------------------------ @@ -739,8 +766,8 @@ inline QString toString(const TFarmTask &task, int ver) { ss += ","; ss += QString::number(task.m_platform) + ","; - int depCount = 0; - if (task.m_dependencies) depCount = task.m_dependencies->getTaskCount(); + int depCount = 0; + if (task.m_dependencies) depCount= task.m_dependencies->getTaskCount(); ss += QString::number(depCount); @@ -1292,8 +1319,8 @@ bool FarmController::tryToStartTask(CtrlFarmTask *task) { map::iterator itSubTask = m_tasks.find(TaskId(*itSubTaskId)); if (itSubTask != m_tasks.end()) { - CtrlFarmTask *subTask = itSubTask->second; - if (tryToStartTask(subTask)) started = true; + CtrlFarmTask *subTask = itSubTask->second; + if (tryToStartTask(subTask)) started= true; } } @@ -1674,7 +1701,7 @@ void FarmController::queryTaskShortInfo(const QString &id, QString &parentId, void FarmController::attachServer(const QString &name, const QString &addr, int port) { - FarmServerProxy *server = 0; + FarmServerProxy *server = 0; map::iterator it = m_servers.begin(); for (; it != m_servers.end(); ++it) { FarmServerProxy *s = it->second; @@ -1833,8 +1860,8 @@ void FarmController::taskCompleted(const QString &taskId, int exitCode) { } else { switch (exitCode) { case 0: - task->m_status = Completed; - if (isAScript(task)) task->m_successfullSteps = task->m_stepCount; + task->m_status = Completed; + if (isAScript(task)) task->m_successfullSteps= task->m_stepCount; break; case RENDER_LICENSE_NOT_FOUND: task->m_status = Waiting; @@ -2202,6 +2229,7 @@ public: void ControllerService::onStart(int argc, char *argv[]) { // Initialize thread components TThread::init(); + TVER::ToonzVersion tver; if (isRunningAsConsoleApp()) { // i messaggi verranno ridiretti sullo standard output @@ -2212,7 +2240,8 @@ void ControllerService::onStart(int argc, char *argv[]) { if (!lRootDirExists) { QString errMsg("Unable to start the Controller"); errMsg += "\n"; - errMsg += "The directory specified as Local Root does not exist"; + errMsg += "The directory " + lRootDir.getQString() + + " specified as Local Root does not exist"; errMsg += "\n"; addToMessageLog(errMsg); @@ -2224,12 +2253,14 @@ void ControllerService::onStart(int argc, char *argv[]) { TFilePath logFilePath = lRootDir + "controller.log"; m_userLog = new TUserLog(logFilePath); } - - m_userLog->info("ToonzFarm Controller 1.0\n\n"); +std: + string appverinfo = tver.getAppVersionInfo("Farm Controller") + "\n\n"; + m_userLog->info(appverinfo.c_str()); TFilePath globalRoot = getGlobalRoot(); if (globalRoot.isEmpty()) { - QString errMsg("Unable to get FARMROOT environment variable\n"); + QString errMsg("Unable to get FARMROOT environment variable (" + + globalRoot.getQString() + ")\n"); addToMessageLog(errMsg); // exit the program @@ -2242,8 +2273,8 @@ void ControllerService::onStart(int argc, char *argv[]) { if (!fs.isDirectory()) globalRootExists = false; if (!globalRootExists) { - QString errMsg( - "The directory specified as TFARMGLOBALROOT does not exist\n"); + QString errMsg("The directory " + globalRoot.getQString() + + " specified as TFARMGLOBALROOT does not exist\n"); addToMessageLog(errMsg); // exit the program diff --git a/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp b/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp index c05d048..0b4b62c 100644 --- a/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp +++ b/toonz/sources/toonzfarm/tfarmserver/tfarmserver.cpp @@ -1,5 +1,4 @@ - #include "tfarmserver.h" #include "tfarmexecutor.h" #include "tfarmcontroller.h" @@ -11,6 +10,8 @@ #include "tlog.h" #include "tfilepath_io.h" #include "tcli.h" +#include "tversion.h" +using namespace TVER; #include #include @@ -62,16 +63,28 @@ namespace { //-------------------------------------------------------------------- TFilePath getGlobalRoot() { + TVER::ToonzVersion tver; TFilePath rootDir; #ifdef _WIN32 - TFilePath name(L"SOFTWARE\\OpenToonz\\OpenToonz\\1.0\\FARMROOT"); + std::string regpath = "SOFTWARE\\" + tver.getAppName() + "\\" + + tver.getAppName() + "\\" + tver.getAppVersionString() + + "\\FARMROOT"; + TFilePath name(regpath); rootDir = TFilePath(TSystem::getSystemValue(name).toStdString()); #else - // Leggo la localRoot da File txt - - Tifstream is( - TFilePath("./OpenToonz_1.0.app/Contents/Resources/configfarmroot.txt")); +// Leggo la localRoot da File txt +#ifdef MACOSX + // If MACOSX, change to MACOSX path + std::string unixpath = "./" + tver.getAppName() + "_" + + tver.getAppVersionString() + + ".app/Contents/Resources/configfarmroot.txt"; +#else + // set path to something suitable for most linux (Unix?) systems + std::string unixpath = "/etc/" + tver.getAppName() + "/opentoonz.conf"; +#endif + TFilePath name(unixpath); + Tifstream is(name); if (is) { char line[1024]; is.getline(line, 80); @@ -95,15 +108,28 @@ TFilePath getGlobalRoot() { //-------------------------------------------------------------------- TFilePath getLocalRoot() { + TVER::ToonzVersion tver; TFilePath lroot; #ifdef _WIN32 - TFilePath name("SOFTWARE\\OpenToonz\\OpenToonz\\1.0\\TOONZROOT"); + QString regpath = QString::fromStdString( + "SOFTWARE\\" + tver.getAppName() + "\\" + tver.getAppName() + "\\" + + tver.getAppVersionString() + "\\FARMROOT"); + TFilePath name(regpath); lroot = TFilePath(TSystem::getSystemValue(name).toStdString()) + TFilePath("toonzfarm"); #else - Tifstream is( - TFilePath("./OpenToonz_1.0.app/Contents/Resources/configfarmroot.txt")); +#ifdef MACOSX + // If MACOSX, change to MACOSX path + std::string unixpath = "./" + tver.getAppName() + "_" + + tver.getAppVersionString() + + ".app/Contents/Resources/configfarmroot.txt"; +#else + // set path to something suitable for most linux (Unix?) systems + std::string unixpath = "/etc/" + tver.getAppName() + "/opentoonz.conf"; +#endif + TFilePath name(unixpath); + Tifstream is(name); if (is) { char line[1024]; is.getline(line, 80); @@ -723,6 +749,7 @@ static bool loadServerData(const QString &hostname, QString &addr, int &port) { void FarmServerService::onStart(int argc, char *argv[]) { // Initialize thread components TThread::init(); + TVER::ToonzVersion tver; #ifdef _WIN32 // DebugBreak(); @@ -735,7 +762,8 @@ void FarmServerService::onStart(int argc, char *argv[]) { if (!lRootDirExists) { std::string errMsg("Unable to start the Server"); errMsg += "\n"; - errMsg += "The directory specified as Local Root does not exist"; + errMsg += "The directory " + ::to_string(lRootDir) + + " specified as Local Root does not exist"; errMsg += "\n"; addToMessageLog(errMsg); @@ -751,7 +779,8 @@ void FarmServerService::onStart(int argc, char *argv[]) { TFilePath gRootDir = getGlobalRoot(); if (::to_string(gRootDir) == "") { - std::string errMsg("Unable to get TFARMGLOBALROOT environment variable"); + std::string errMsg("Unable to get TFARMGLOBALROOT environment variable (" + + ::to_string(gRootDir) + ")"); addToMessageLog(errMsg); // DEBUG MAC SERVIZIO (DA TOGLIERE) @@ -807,7 +836,9 @@ void FarmServerService::onStart(int argc, char *argv[]) { m_userLog = new TUserLog(logFilePath); } - m_userLog->info("ToonzFarm Server 1.0"); +std: + string appverinfo = tver.getAppVersionInfo("Farm Server") + "\n\n"; + m_userLog->info(appverinfo.c_str()); // legge dal file di configurazione dei server il numero di porta da // utilizzare @@ -819,7 +850,8 @@ void FarmServerService::onStart(int argc, char *argv[]) { msg += TSystem::getHostName(); msg += " from the servers config file"; msg += "\n"; - msg += "Using the default port number 8002"; + msg += "Using the default port number "; + msg += QString::number(m_port); msg += "\n"; msg += "\n"; diff --git a/toonz/sources/toonzlib/CMakeLists.txt b/toonz/sources/toonzlib/CMakeLists.txt index ae3f654..9bc91f3 100644 --- a/toonz/sources/toonzlib/CMakeLists.txt +++ b/toonz/sources/toonzlib/CMakeLists.txt @@ -35,6 +35,9 @@ set(MOC_HEADERS ../include/toonz/logger.h ../include/toonz/movierenderer.h ../include/toonz/multimediarenderer.h + ../include/toonz/mypaint.h + ../include/toonz/mypainthelpers.hpp + ../include/toonz/mypaintbrushstyle.h ../include/toonz/namebuilder.h ../include/toonz/Naa2TlvConverter.h ../include/toonz/observer.h @@ -152,6 +155,7 @@ set(MOC_HEADERS sandor_fxs/YOMBParam.h texturemanager.h imagebuilders.h + ../include/orientation.h ) set(HEADERS ${MOC_HEADERS}) @@ -161,6 +165,7 @@ set(SOURCES autoclose.cpp autopos.cpp captureparameters.cpp + cellpositionratio.cpp childstack.cpp cleanupcolorstyles.cpp cleanuppalette.cpp @@ -189,10 +194,12 @@ set(SOURCES logger.cpp movierenderer.cpp multimediarenderer.cpp + mypaintbrushstyle.cpp namebuilder.cpp Naa2TlvConverter.cpp observer.cpp onionskinmask.cpp + orientation.cpp outputproperties.cpp preferences.cpp rasterbrush.cpp @@ -345,7 +352,7 @@ include_directories( if(BUILD_ENV_MSVC) target_link_libraries(toonzlib Qt5::Core Qt5::Gui Qt5::OpenGL Qt5::Script - ${GLUT_LIB} ${GL_LIB} vfw32.lib + ${GLUT_LIB} ${GL_LIB} ${MYPAINT_LIB_LDFLAGS} vfw32.lib tnzcore tnzbase tnzext ) elseif(BUILD_ENV_APPLE) @@ -354,6 +361,7 @@ elseif(BUILD_ENV_APPLE) ${CMAKE_CURRENT_BINARY_DIR}/../tnzbase/libtnzbase.dylib ${CMAKE_CURRENT_BINARY_DIR}/../tnzext/libtnzext.dylib ${USB_LIB} + ${MYPAINT_LIB_LDFLAGS} ) target_link_libraries(toonzlib Qt5::Core Qt5::Gui Qt5::OpenGL Qt5::Script ${GLUT_LIB} ${GL_LIB} ${EXTRA_LIBS}) @@ -364,5 +372,5 @@ elseif(BUILD_ENV_UNIXLIKE) set(EXTRA_LIBS ${EXTRA_LIBS} -lvfw32) endif() - target_link_libraries(toonzlib Qt5::Core Qt5::Gui Qt5::OpenGL Qt5::Script ${GLUT_LIB} ${GL_LIB} ${EXTRA_LIBS}) + target_link_libraries(toonzlib Qt5::Core Qt5::Gui Qt5::OpenGL Qt5::Script ${GLUT_LIB} ${GL_LIB} ${EXTRA_LIBS} ${MYPAINT_LIB_LDFLAGS}) endif() diff --git a/toonz/sources/toonzlib/cellpositionratio.cpp b/toonz/sources/toonzlib/cellpositionratio.cpp new file mode 100644 index 0000000..1b95b03 --- /dev/null +++ b/toonz/sources/toonzlib/cellpositionratio.cpp @@ -0,0 +1,66 @@ +#include "toonz/cellpositionratio.h" + +#include +#include + +// Euclid's algorithm +int greatestCommonDivisor(int a, int b) { + a = std::abs(a); + b = std::abs(b); + int c = std::max(a, b); + int d = std::min(a, b); + while (d) { + int q = c / d; + int r = c % d; + c = d; + d = r; + } + return c; +} + +int leastCommonMultiple(int a, int b) { + return a * b / greatestCommonDivisor(a, b); +} + +void Ratio::normalize() { + int gcd = greatestCommonDivisor(m_num, m_denom); + if (m_denom < 0) gcd = -gcd; + m_num /= gcd; + m_denom /= gcd; +} + +Ratio Ratio::normalized() const { + Ratio copy(*this); + copy.normalize(); + return copy; +} + +Ratio::Ratio(int num, int denom) : m_num(num), m_denom(denom) { + if (!denom) throw std::runtime_error("ratio with denominator == 0"); + normalize(); +} + +Ratio operator*(const Ratio &a, const Ratio &b) { + return Ratio(a.m_num * b.m_num, a.m_denom * b.m_denom); +} +Ratio operator/(const Ratio &a, const Ratio &b) { + return Ratio(a.m_num * b.m_denom, a.m_denom * b.m_num); +} + +Ratio operator+(const Ratio &a, const Ratio &b) { + int gcd = greatestCommonDivisor(a.m_denom, b.m_denom); + int denom = a.m_denom * b.m_denom / gcd; + int aMult = b.m_denom * gcd; + int bMult = a.m_denom * gcd; + return Ratio(a.m_num * aMult + b.m_num * bMult, denom); +} + +Ratio operator-(const Ratio &a, const Ratio &b) { + int gcd = greatestCommonDivisor(a.m_denom, b.m_denom); + int denom = a.m_denom * b.m_denom / gcd; + int aMult = b.m_denom * gcd; + int bMult = a.m_denom * gcd; + return Ratio(a.m_num * aMult - b.m_num * bMult, denom); +} + +int operator*(const Ratio &a, int b) { return a.m_num * b / a.m_denom; } diff --git a/toonz/sources/toonzlib/columnfan.cpp b/toonz/sources/toonzlib/columnfan.cpp index 84a37b5..4b24cf3 100644 --- a/toonz/sources/toonzlib/columnfan.cpp +++ b/toonz/sources/toonzlib/columnfan.cpp @@ -9,36 +9,39 @@ #include //============================================================================= +// ColumnFan -const int colWidth = 74; -const int colSkip = 9; +ColumnFan::ColumnFan() : m_firstFreePos(0), m_unfolded(74), m_folded(9) {} -//============================================================================= -// ColumnFan +//----------------------------------------------------------------------------- -ColumnFan::ColumnFan() : m_firstFreePos(0) {} +void ColumnFan::setDimension(int unfolded) { + m_unfolded = unfolded; + // folded always 9 + update(); +} //----------------------------------------------------------------------------- void ColumnFan::update() { - int lastPos = -colWidth; + int lastPos = -m_unfolded; bool lastActive = true; int m = m_columns.size(); int i; for (i = 0; i < m; i++) { bool active = m_columns[i].m_active; if (lastActive) - lastPos += colWidth; + lastPos += m_unfolded; else if (active) - lastPos += colSkip; + lastPos += m_folded; m_columns[i].m_pos = lastPos; lastActive = active; } - m_firstFreePos = lastPos + (lastActive ? colWidth : colSkip); + m_firstFreePos = lastPos + (lastActive ? m_unfolded : m_folded); m_table.clear(); for (i = 0; i < m; i++) if (m_columns[i].m_active) - m_table[m_columns[i].m_pos + colWidth - 1] = i; + m_table[m_columns[i].m_pos + m_unfolded - 1] = i; else if (i + 1 < m && m_columns[i + 1].m_active) m_table[m_columns[i + 1].m_pos - 1] = i; else if (i + 1 == m) @@ -47,24 +50,24 @@ void ColumnFan::update() { //----------------------------------------------------------------------------- -int ColumnFan::xToCol(int x) const { - if (x < m_firstFreePos) { - std::map::const_iterator it = m_table.lower_bound(x); +int ColumnFan::layerAxisToCol(int coord) const { + if (coord < m_firstFreePos) { + std::map::const_iterator it = m_table.lower_bound(coord); if (it == m_table.end()) return -3; assert(it != m_table.end()); return it->second; } else - return m_columns.size() + (x - m_firstFreePos) / colWidth; + return m_columns.size() + (coord - m_firstFreePos) / m_unfolded; } //----------------------------------------------------------------------------- -int ColumnFan::colToX(int col) const { +int ColumnFan::colToLayerAxis(int col) const { int m = m_columns.size(); if (col >= 0 && col < m) return m_columns[col].m_pos; else - return m_firstFreePos + (col - m) * colWidth; + return m_firstFreePos + (col - m) * m_unfolded; } //----------------------------------------------------------------------------- @@ -106,7 +109,15 @@ bool ColumnFan::isEmpty() const { return m_columns.empty(); } //----------------------------------------------------------------------------- -void ColumnFan::saveData(TOStream &os) { +void ColumnFan::copyFoldedStateFrom(const ColumnFan &from) { + for (int i = 0, n = (int)from.m_columns.size(); i < n; i++) + if (!from.isActive(i)) deactivate(i); +} + +//----------------------------------------------------------------------------- + +void ColumnFan::saveData( + TOStream &os) { // only saves indices of folded columns int index, n = (int)m_columns.size(); for (index = 0; index < n;) { while (index < n && m_columns[index].m_active) index++; diff --git a/toonz/sources/toonzlib/levelproperties.cpp b/toonz/sources/toonzlib/levelproperties.cpp index 2ef2108..ebde85c 100644 --- a/toonz/sources/toonzlib/levelproperties.cpp +++ b/toonz/sources/toonzlib/levelproperties.cpp @@ -10,7 +10,7 @@ //********************************************************************************** LevelOptions::LevelOptions() - : m_dpi(Stage::inch) + : m_dpi(Stage::standardDpi) , m_subsampling(1) , m_antialias(0) , m_dpiPolicy(DP_ImageDpi) diff --git a/toonz/sources/toonzlib/mypaintbrushstyle.cpp b/toonz/sources/toonzlib/mypaintbrushstyle.cpp new file mode 100644 index 0000000..1cc985e --- /dev/null +++ b/toonz/sources/toonzlib/mypaintbrushstyle.cpp @@ -0,0 +1,278 @@ + +#include + +#include + +#include "tfilepath_io.h" +#include "timage_io.h" +#include "trop.h" +#include "tsystem.h" +#include "tvectorimage.h" +#include "tpixelutils.h" +#include "toonz/toonzscene.h" + +#include "toonz/mypaintbrushstyle.h" + + +//************************************************************************************* +// TMyPaintBrushStyle implementation +//************************************************************************************* + +TMyPaintBrushStyle::TMyPaintBrushStyle() + { } + +//----------------------------------------------------------------------------- + +TMyPaintBrushStyle::TMyPaintBrushStyle(const TFilePath &path) { + loadBrush(path); +} + +//----------------------------------------------------------------------------- + +TMyPaintBrushStyle::TMyPaintBrushStyle(const TMyPaintBrushStyle &other): + TColorStyle(other), + m_path (other.m_path), + m_fullpath (other.m_fullpath), + m_brushOriginal (other.m_brushOriginal), + m_brushModified (other.m_brushModified), + m_preview (other.m_preview), + m_color (other.m_color), + m_baseValues (other.m_baseValues) + { } + + +//----------------------------------------------------------------------------- + +TMyPaintBrushStyle::~TMyPaintBrushStyle() + { } + +//----------------------------------------------------------------------------- + +TColorStyle& TMyPaintBrushStyle::copy(const TColorStyle &other) { + const TMyPaintBrushStyle *otherBrushStyle = + dynamic_cast(&other); + if (otherBrushStyle) { + m_path = otherBrushStyle->m_path; + m_fullpath = otherBrushStyle->m_fullpath; + m_brushOriginal = otherBrushStyle->m_brushOriginal; + m_brushModified = otherBrushStyle->m_brushModified; + m_preview = otherBrushStyle->m_preview; + m_baseValues = otherBrushStyle->m_baseValues; + } + assignBlend(other, other, 0.0); + return *this; +} + +//----------------------------------------------------------------------------- + +QString TMyPaintBrushStyle::getDescription() const + { return "MyPaintBrushStyle"; } + +//----------------------------------------------------------------------------- + +std::string TMyPaintBrushStyle::getBrushType() + { return "myb"; } + +//----------------------------------------------------------------------------- + +TFilePathSet TMyPaintBrushStyle::getBrushesDirs() { + TFilePathSet paths; + paths.push_back(m_libraryDir + "mypaint brushes"); + QStringList genericLocations = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); + for(QStringList::iterator i = genericLocations.begin(); i != genericLocations.end(); ++i) + paths.push_back(TFilePath(*i) + "mypaint" + "brushes"); + return paths; +} + +//----------------------------------------------------------------------------- + +TFilePath TMyPaintBrushStyle::decodePath(const TFilePath &path) const { + if (path.isAbsolute()) + return path; + + if (m_currentScene) { + TFilePath p = m_currentScene->decodeFilePath(path); + TFileStatus fs(p); + if (fs.doesExist() && !fs.isDirectory()) + return p; + } + + TFilePathSet paths = getBrushesDirs(); + for(TFilePathSet::iterator i = paths.begin(); i != paths.end(); ++i) { + TFilePath p = *i + path; + TFileStatus fs(p); + if (fs.doesExist() && !fs.isDirectory()) + return p; + } + + return path; +} + +//----------------------------------------------------------------------------- + +void TMyPaintBrushStyle::loadBrush(const TFilePath &path) { + m_path = path; + m_fullpath = decodePath(path); + m_brushOriginal.fromDefaults(); + + Tifstream is(m_fullpath); + if (is) { + std::string str; + str.assign( std::istreambuf_iterator(is), std::istreambuf_iterator() ); + m_brushOriginal.fromString(str); + } + + m_brushModified = m_brushOriginal; + std::map baseValuesCopy; + baseValuesCopy.swap(m_baseValues); + for(std::map::const_iterator i = baseValuesCopy.begin(); i != baseValuesCopy.end(); ++i) + setBaseValue(i->first, i->second); + + TFilePath preview_path = m_fullpath.getParentDir() + (m_fullpath.getWideName() + L"_prev.png"); + TImageReader::load(preview_path, m_preview); + + invalidateIcon(); +} + +//----------------------------------------------------------------------------- + +void TMyPaintBrushStyle::setBaseValue(MyPaintBrushSetting id, bool enable, float value) { + float def = m_brushOriginal.getBaseValue(id); + if (enable && fabsf(value - def) > 0.01) { + m_baseValues[id] = value; + m_brushModified.setBaseValue(id, value); + } else { + m_baseValues.erase(id); + m_brushModified.setBaseValue(id, def); + } +} + +//----------------------------------------------------------------------------- + +void TMyPaintBrushStyle::resetBaseValues() { + for(int i = 0; i < MYPAINT_BRUSH_SETTINGS_COUNT; ++i) + setBaseValueEnabled((MyPaintBrushSetting)i, false); +} + +//----------------------------------------------------------------------------- + +void TMyPaintBrushStyle::makeIcon(const TDimension &d) { + TFilePath path = m_fullpath.getParentDir() + (m_fullpath.getWideName() + L"_prev.png"); + if (!m_preview) { + m_icon = TRaster32P(d); + m_icon->fill(TPixel32::Red); + } else + if (m_preview->getSize() == d) { + m_icon = m_preview; + } else { + m_icon = TRaster32P(d); + double sx = (double)d.lx/(double)m_preview->getLx(); + double sy = (double)d.ly/(double)m_preview->getLy(); + TRop::resample(m_icon, m_preview, TScale(sx, sy)); + } + + // paint color marker + if (d.lx > 0 && d.ly > 0) { + int size = std::min( 1 + std::min(d.lx, d.ly)*2/3, + 1 + std::max(d.lx, d.ly)/2 ); + TPixel32 color = getMainColor(); + for(int y = 0; y < size; ++y) { + TPixel32 *p = m_icon->pixels(d.ly - y - 1); + TPixel32 *endp = p + size - y - 1; + for( ;p != endp; ++p) + *p = color; + *p = blend(*p, color, 0.5); + } + } +} + +//------------------------------------------------------------ + +void TMyPaintBrushStyle::loadData(TInputStreamInterface &is) { + std::string path; + is >> path; + is >> m_color; + loadBrush(TFilePath(path)); + + int baseSettingsCount = 0; + is >> baseSettingsCount; + for(int i = 0; i < baseSettingsCount; ++i) { + std::string key; + double value = 0.0; + int inputsCount = 0; + is >> key; + is >> value; + const mypaint::Setting *setting = mypaint::Setting::findByKey(key); + if (setting) setBaseValue(setting->id, value); + } +} + +//----------------------------------------------------------------------------- + +void TMyPaintBrushStyle::saveData(TOutputStreamInterface &os) const { + std::wstring wstr = m_path.getWideString(); + std::string str; + str.assign(wstr.begin(), wstr.end()); + os << str; + os << m_color; + + os << (int)m_baseValues.size(); + for(std::map::const_iterator i = m_baseValues.begin(); i != m_baseValues.end(); ++i) { + os << mypaint::Setting::byId(i->first).key; + os << (double)i->second; + } +} + +//----------------------------------------------------------------------------- + +int TMyPaintBrushStyle::getParamCount() const + { return MYPAINT_BRUSH_SETTINGS_COUNT; } + +//----------------------------------------------------------------------------- + +QString TMyPaintBrushStyle::getParamNames(int index) const + { return QString::fromUtf8(mypaint::Setting::byId((MyPaintBrushSetting)index).name.c_str()); } + +//----------------------------------------------------------------------------- + +TColorStyle::ParamType TMyPaintBrushStyle::getParamType(int index) const + { return DOUBLE; } + +//----------------------------------------------------------------------------- + +bool TMyPaintBrushStyle::hasParamDefault(int index) const + { return true; } + +//----------------------------------------------------------------------------- + +void TMyPaintBrushStyle::setParamDefault(int index) + { setBaseValueEnabled((MyPaintBrushSetting)index, false); } + +//----------------------------------------------------------------------------- + +bool TMyPaintBrushStyle::isParamDefault(int index) const + { return getBaseValueEnabled((MyPaintBrushSetting)index); } + +//----------------------------------------------------------------------------- + +void TMyPaintBrushStyle::getParamRange(int index, double &min, double &max) const { + const mypaint::Setting &setting = mypaint::Setting::byId((MyPaintBrushSetting)index); + min = setting.min; + max = setting.max; +} + +//----------------------------------------------------------------------------- + +void TMyPaintBrushStyle::setParamValue(int index, double value) + { setBaseValue((MyPaintBrushSetting)index, value); } + +//----------------------------------------------------------------------------- + +double TMyPaintBrushStyle::getParamValue(double_tag, int index) const + { return getBaseValue((MyPaintBrushSetting)index); } + +//----------------------------------------------------------------------------- + +namespace { + TColorStyle::Declaration mypaintBrushStyle(new TMyPaintBrushStyle()); +} diff --git a/toonz/sources/toonzlib/orientation.cpp b/toonz/sources/toonzlib/orientation.cpp new file mode 100644 index 0000000..3c91719 --- /dev/null +++ b/toonz/sources/toonzlib/orientation.cpp @@ -0,0 +1,813 @@ +#include "orientation.h" +#include "toonz/columnfan.h" + +#include +#include +#include + +using std::pair; + +namespace { +const int KEY_ICON_WIDTH = 11; +const int KEY_ICON_HEIGHT = 13; +const int EASE_TRIANGLE_SIZE = 4; +const int PLAY_MARKER_SIZE = 10; +const int ONION_SIZE = 19; +const int ONION_DOT_SIZE = 8; +const int PINNED_SIZE = 10; +} + +class TopToBottomOrientation : public Orientation { + const int CELL_WIDTH = 74; + const int CELL_HEIGHT = 20; + const int CELL_DRAG_WIDTH = 7; + const int EXTENDER_WIDTH = 18; + const int EXTENDER_HEIGHT = 8; + const int SOUND_PREVIEW_WIDTH = 7; + const int LAYER_HEADER_HEIGHT = CELL_HEIGHT * 3 + 60; + const int FOLDED_LAYER_HEADER_HEIGHT = LAYER_HEADER_HEIGHT; + const int FOLDED_LAYER_HEADER_WIDTH = 8; + const int FRAME_HEADER_WIDTH = CELL_WIDTH; + const int PLAY_RANGE_X = FRAME_HEADER_WIDTH / 2 - PLAY_MARKER_SIZE; + const int ONION_X = 0, ONION_Y = 0; + const int ICON_WIDTH = CELL_HEIGHT; + +public: + TopToBottomOrientation(); + + virtual CellPosition xyToPosition(const QPoint &xy, + const ColumnFan *fan) const override; + virtual QPoint positionToXY(const CellPosition &position, + const ColumnFan *fan) const override; + virtual CellPositionRatio xyToPositionRatio(const QPoint &xy) const override; + virtual QPoint positionRatioToXY( + const CellPositionRatio &ratio) const override; + + virtual int colToLayerAxis(int layer, const ColumnFan *fan) const override; + virtual int rowToFrameAxis(int frame) const override; + + virtual QPoint frameLayerToXY(int frameAxis, int layerAxis) const override; + virtual int layerAxis(const QPoint &xy) const override; + virtual int frameAxis(const QPoint &xy) const override; + + virtual NumberRange layerSide(const QRect &area) const override; + virtual NumberRange frameSide(const QRect &area) const override; + virtual QPoint topRightCorner(const QRect &area) const override; + + virtual CellPosition arrowShift(int direction) const override; + + virtual QString name() const override { return "TopToBottom"; } + virtual QString caption() const override { return "Xsheet"; } + virtual const Orientation *next() const override { + return Orientations::leftToRight(); + } + + virtual bool isVerticalTimeline() const override { return true; } + virtual bool flipVolume() const override { return true; } + + virtual int cellWidth() const override { return CELL_WIDTH; } + virtual int cellHeight() const override { return CELL_HEIGHT; } +}; + +class LeftToRightOrientation : public Orientation { + const int CELL_WIDTH = 50; + const int CELL_HEIGHT = 20; + const int CELL_DRAG_HEIGHT = 5; + const int EXTENDER_WIDTH = 8; + const int EXTENDER_HEIGHT = 12; + const int SOUND_PREVIEW_HEIGHT = 6; + const int FRAME_HEADER_HEIGHT = 50; + const int ONION_X = (CELL_WIDTH - ONION_SIZE) / 2, ONION_Y = 0; + const int PLAY_RANGE_Y = ONION_SIZE; + const int ICON_WIDTH = CELL_HEIGHT; + const int ICON_OFFSET = ICON_WIDTH; + const int ICONS_WIDTH = ICON_OFFSET * 3; // 88 + const int LAYER_NUMBER_WIDTH = 20; + const int LAYER_NAME_WIDTH = 170; + const int LAYER_HEADER_WIDTH = + ICONS_WIDTH + LAYER_NUMBER_WIDTH + LAYER_NAME_WIDTH; + const int FOLDED_LAYER_HEADER_HEIGHT = 8; + const int FOLDED_LAYER_HEADER_WIDTH = LAYER_HEADER_WIDTH; + +public: + LeftToRightOrientation(); + + virtual CellPosition xyToPosition(const QPoint &xy, + const ColumnFan *fan) const override; + virtual QPoint positionToXY(const CellPosition &position, + const ColumnFan *fan) const override; + virtual CellPositionRatio xyToPositionRatio(const QPoint &xy) const override; + virtual QPoint positionRatioToXY( + const CellPositionRatio &ratio) const override; + + virtual int colToLayerAxis(int layer, const ColumnFan *fan) const override; + virtual int rowToFrameAxis(int frame) const override; + + virtual QPoint frameLayerToXY(int frameAxis, int layerAxis) const override; + virtual int layerAxis(const QPoint &xy) const override; + virtual int frameAxis(const QPoint &xy) const override; + + virtual NumberRange layerSide(const QRect &area) const override; + virtual NumberRange frameSide(const QRect &area) const override; + virtual QPoint topRightCorner(const QRect &area) const override; + + virtual CellPosition arrowShift(int direction) const override; + + virtual QString name() const override { return "LeftToRight"; } + virtual QString caption() const override { return "Timeline"; } + virtual const Orientation *next() const override { + return Orientations::topToBottom(); + } + + virtual bool isVerticalTimeline() const override { return false; } + virtual bool flipVolume() const override { return false; } + + virtual int cellWidth() const override { return CELL_WIDTH; } + virtual int cellHeight() const override { return CELL_HEIGHT; } +}; + +/// ------------------------------------------------------------------------------- + +int NumberRange::weight(double toWeight) const { // weight ranging 0..1 + return _from + (_to - _from) * toWeight; +} + +NumberRange NumberRange::adjusted(int addFrom, int addTo) const { + return NumberRange(_from + addFrom, _to + addTo); +} + +double NumberRange::ratio(int at) const { + double result = ((double)at - _from) / (_to - _from); + if (result < 0) result = 0; + if (result > 1) result = 1; + return result; +} + +/// ------------------------------------------------------------------------------- + +// const int Orientations::COUNT = 2; + +Orientations::Orientations() : _topToBottom(nullptr), _leftToRight(nullptr) { + _topToBottom = new TopToBottomOrientation(); + _leftToRight = new LeftToRightOrientation(); + + _all.push_back(_topToBottom); + _all.push_back(_leftToRight); +} +Orientations::~Orientations() { + delete _topToBottom; + _topToBottom = nullptr; + delete _leftToRight; + _leftToRight = nullptr; +} + +const Orientations &Orientations::instance() { + static Orientations singleton; + return singleton; +} + +const Orientation *Orientations::topToBottom() { + return instance()._topToBottom; +} +const Orientation *Orientations::leftToRight() { + return instance()._leftToRight; +} +const vector &Orientations::all() { + return instance()._all; +} +const Orientation *Orientations::byName(const QString &name) { + vector m_all = all(); + for (auto it = m_all.begin(); it != m_all.end(); it++) + if ((*it)->name() == name) return *it; + throw std::runtime_error( + (QString("no such orientation: ") + name).toStdString().c_str()); +} + +/// ------------------------------------------------------------------------------- + +QLine Orientation::verticalLine(int layerAxis, + const NumberRange &frameAxis) const { + QPoint first = frameLayerToXY(frameAxis.from(), layerAxis); + QPoint second = frameLayerToXY(frameAxis.to(), layerAxis); + return QLine(first, second); +} +QLine Orientation::horizontalLine(int frameAxis, + const NumberRange &layerAxis) const { + QPoint first = frameLayerToXY(frameAxis, layerAxis.from()); + QPoint second = frameLayerToXY(frameAxis, layerAxis.to()); + return QLine(first, second); +} +QRect Orientation::frameLayerRect(const NumberRange &frameAxis, + const NumberRange &layerAxis) const { + QPoint topLeft = frameLayerToXY(frameAxis.from(), layerAxis.from()); + QPoint bottomRight = frameLayerToXY(frameAxis.to(), layerAxis.to()); + return QRect(topLeft, bottomRight); +} + +QRect Orientation::foldedRectangle(int layerAxis, const NumberRange &frameAxis, + int i) const { + QPoint topLeft = frameLayerToXY(frameAxis.from(), layerAxis + 1 + i * 3); + QPoint size = frameLayerToXY(frameAxis.length(), 2); + return QRect(topLeft, QSize(size.x(), size.y())); +} +QLine Orientation::foldedRectangleLine(int layerAxis, + const NumberRange &frameAxis, + int i) const { + return verticalLine(layerAxis + i * 3, frameAxis); +} + +void Orientation::addRect(PredefinedRect which, const QRect &rect) { + _rects.insert(pair(which, rect)); +} +void Orientation::addLine(PredefinedLine which, const QLine &line) { + _lines.insert(pair(which, line)); +} +void Orientation::addDimension(PredefinedDimension which, int dimension) { + _dimensions.insert(pair(which, dimension)); +} +void Orientation::addPath(PredefinedPath which, const QPainterPath &path) { + _paths.insert(pair(which, path)); +} +void Orientation::addPoint(PredefinedPoint which, const QPoint &point) { + _points.insert(pair(which, point)); +} +void Orientation::addRange(PredefinedRange which, const NumberRange &range) { + _ranges.insert(pair(which, range)); +} + +/// ------------------------------------------------------------------------------- + +TopToBottomOrientation::TopToBottomOrientation() { + // + // Area rectangles + // + + // Cell viewer + QRect cellRect(0, 0, CELL_WIDTH, CELL_HEIGHT); + addRect(PredefinedRect::CELL, cellRect); + addRect(PredefinedRect::DRAG_HANDLE_CORNER, + QRect(0, 0, CELL_DRAG_WIDTH, CELL_HEIGHT)); + QRect keyRect(CELL_WIDTH - KEY_ICON_WIDTH, + (CELL_HEIGHT - KEY_ICON_HEIGHT) / 2, KEY_ICON_WIDTH, + KEY_ICON_HEIGHT); + addRect(PredefinedRect::KEY_ICON, keyRect); + QRect nameRect = cellRect.adjusted(8, 0, -6, 0); + addRect(PredefinedRect::CELL_NAME, nameRect); + addRect(PredefinedRect::CELL_NAME_WITH_KEYFRAME, + nameRect.adjusted(0, 0, -KEY_ICON_WIDTH, 0)); + addRect(PredefinedRect::END_EXTENDER, + QRect(-EXTENDER_WIDTH - KEY_ICON_WIDTH, 0, EXTENDER_WIDTH, + EXTENDER_HEIGHT)); + addRect(PredefinedRect::BEGIN_EXTENDER, + QRect(-EXTENDER_WIDTH - KEY_ICON_WIDTH, -EXTENDER_HEIGHT, + EXTENDER_WIDTH, EXTENDER_HEIGHT)); + addRect(PredefinedRect::KEYFRAME_AREA, + QRect(CELL_WIDTH - KEY_ICON_WIDTH, 0, KEY_ICON_WIDTH, CELL_HEIGHT)); + addRect(PredefinedRect::DRAG_AREA, QRect(0, 0, CELL_DRAG_WIDTH, CELL_HEIGHT)); + QRect soundRect(CELL_DRAG_WIDTH, 0, + CELL_WIDTH - CELL_DRAG_WIDTH - SOUND_PREVIEW_WIDTH, + CELL_HEIGHT); + addRect(PredefinedRect::SOUND_TRACK, soundRect); + addRect(PredefinedRect::PREVIEW_TRACK, + QRect(CELL_WIDTH - SOUND_PREVIEW_WIDTH + 1, 0, SOUND_PREVIEW_WIDTH, + CELL_HEIGHT)); + addRect(PredefinedRect::BEGIN_SOUND_EDIT, + QRect(CELL_DRAG_WIDTH, 0, CELL_WIDTH - CELL_DRAG_WIDTH, 2)); + addRect( + PredefinedRect::END_SOUND_EDIT, + QRect(CELL_DRAG_WIDTH, CELL_HEIGHT - 2, CELL_WIDTH - CELL_DRAG_WIDTH, 2)); + addRect(PredefinedRect::LOOP_ICON, QRect(keyRect.left(), 0, 10, 11)); + + // Note viewer + addRect( + PredefinedRect::NOTE_AREA, + QRect(QPoint(0, 0), QSize(FRAME_HEADER_WIDTH, LAYER_HEADER_HEIGHT - 1))); + addRect(PredefinedRect::NOTE_ICON, + QRect(QPoint(0, 0), QSize(CELL_WIDTH - 2, CELL_HEIGHT - 2))); + addRect(PredefinedRect::LAYER_HEADER_PANEL, QRect(0, 0, -1, -1)); // hide + + // Row viewer + addRect(PredefinedRect::FRAME_LABEL, + QRect(CELL_WIDTH / 2, 1, CELL_WIDTH / 2, CELL_HEIGHT - 2)); + addRect(PredefinedRect::FRAME_HEADER, + QRect(0, 0, FRAME_HEADER_WIDTH - 1, CELL_HEIGHT)); + addRect(PredefinedRect::PLAY_RANGE, + QRect(PLAY_RANGE_X, 0, PLAY_MARKER_SIZE, CELL_HEIGHT)); + addRect(PredefinedRect::ONION, + QRect(ONION_X + (3 * ONION_DOT_SIZE - ONION_SIZE) / 2, ONION_Y, + ONION_SIZE, ONION_SIZE)); + int adjustOnion = (ONION_SIZE - ONION_DOT_SIZE) / 2; + addRect(PredefinedRect::ONION_DOT, + QRect(ONION_X + ONION_DOT_SIZE, ONION_Y + adjustOnion, ONION_DOT_SIZE, + ONION_DOT_SIZE)); + addRect( + PredefinedRect::ONION_DOT_FIXED, + QRect(ONION_X, ONION_Y + adjustOnion, ONION_DOT_SIZE, ONION_DOT_SIZE)); + addRect(PredefinedRect::ONION_AREA, + QRect(ONION_X, ONION_Y, PLAY_RANGE_X, CELL_HEIGHT)); + addRect(PredefinedRect::ONION_FIXED_DOT_AREA, + QRect(ONION_X, ONION_Y, ONION_DOT_SIZE, CELL_HEIGHT)); + addRect( + PredefinedRect::ONION_DOT_AREA, + QRect(ONION_X + ONION_DOT_SIZE, ONION_Y, ONION_DOT_SIZE, CELL_HEIGHT)); + addRect(PredefinedRect::PINNED_CENTER_KEY, + QRect((FRAME_HEADER_WIDTH - PINNED_SIZE) / 2, + (CELL_HEIGHT - PINNED_SIZE) / 2, PINNED_SIZE, PINNED_SIZE)); + + // Column viewer + static int INDENT = 9; + static int HDRROW1 = 6; // Name/eye + static int HDRROW2 = HDRROW1 + CELL_HEIGHT; // lock, preview + static int HDRROW3 = HDRROW2 + CELL_HEIGHT + 1; // thumbnail + static int HDRROW4 = HDRROW3 + 48; // pegbar, parenthandle + + addRect(PredefinedRect::LAYER_HEADER, + QRect(0, 1, CELL_WIDTH, LAYER_HEADER_HEIGHT - 3)); + addRect(PredefinedRect::DRAG_LAYER, + QRect(0, 0, CELL_DRAG_WIDTH, LAYER_HEADER_HEIGHT - 3)); + addRect( + PredefinedRect::FOLDED_LAYER_HEADER, + QRect(0, 1, FOLDED_LAYER_HEADER_WIDTH, FOLDED_LAYER_HEADER_HEIGHT - 3)); + + addRect(PredefinedRect::RENAME_COLUMN, + QRect(0, 6, CELL_WIDTH, CELL_HEIGHT - 3)); + + QRect layername(INDENT, HDRROW1, CELL_WIDTH - 11, CELL_HEIGHT - 3); + addRect(PredefinedRect::LAYER_NAME, layername); + addRect(PredefinedRect::LAYER_NUMBER, QRect(0, 0, -1, -1)); // hide + + QRect eyeArea(INDENT, HDRROW1, CELL_WIDTH - 11, CELL_HEIGHT - 3); + addRect(PredefinedRect::EYE_AREA, eyeArea); + QRect eye(eyeArea.right() - 18, HDRROW1, 18, 15); + addRect(PredefinedRect::EYE, eye); + + QRect previewArea(INDENT, HDRROW2, CELL_WIDTH - 11, CELL_HEIGHT - 3); + addRect(PredefinedRect::PREVIEW_LAYER_AREA, previewArea); + QRect preview(previewArea.right() - 18, HDRROW2, 18, 15); + addRect(PredefinedRect::PREVIEW_LAYER, preview); + + QRect lockArea(INDENT, HDRROW2, 16, 16); + addRect(PredefinedRect::LOCK_AREA, lockArea); + QRect lock(INDENT, HDRROW2, 16, 16); + addRect(PredefinedRect::LOCK, lock); + + QRect thumbnailArea(INDENT, HDRROW3, CELL_WIDTH - 11, 42); + addRect(PredefinedRect::THUMBNAIL_AREA, thumbnailArea); + QRect thumbnail(INDENT, HDRROW3, CELL_WIDTH - 11, 42); + addRect(PredefinedRect::THUMBNAIL, thumbnail); + addRect(PredefinedRect::FILTER_COLOR, + QRect(thumbnailArea.right() - 14, thumbnailArea.top() + 3, 12, 12)); + addRect(PredefinedRect::SOUND_ICON, + QRect(thumbnailArea.right() - 40, 3 * CELL_HEIGHT + 4, 40, 30)); + int trackLen = 60; + QRect volumeArea(thumbnailArea.left(), thumbnailArea.top() + 1, + 29 - CELL_DRAG_WIDTH, trackLen + 7); + addRect(PredefinedRect::VOLUME_AREA, volumeArea); + QPoint soundTopLeft(volumeArea.left() + 12, volumeArea.top() + 4); + addRect(PredefinedRect::VOLUME_TRACK, + QRect(soundTopLeft, QSize(3, trackLen))); + + QRect pegbarname(INDENT, HDRROW4, CELL_WIDTH - 11, CELL_HEIGHT - 3); + addRect(PredefinedRect::PEGBAR_NAME, pegbarname); + addRect( + PredefinedRect::PARENT_HANDLE_NAME, + QRect(INDENT + pegbarname.width() - 20, HDRROW4, 20, CELL_HEIGHT - 3)); + + // + // Lines + // + addLine(PredefinedLine::LOCKED, + verticalLine((CELL_DRAG_WIDTH + 1) / 2, NumberRange(0, CELL_HEIGHT))); + addLine(PredefinedLine::SEE_MARKER_THROUGH, + horizontalLine(0, NumberRange(0, CELL_DRAG_WIDTH))); + addLine(PredefinedLine::CONTINUE_LEVEL, + verticalLine(CELL_WIDTH / 2, NumberRange(0, CELL_HEIGHT))); + addLine(PredefinedLine::CONTINUE_LEVEL_WITH_NAME, + verticalLine(CELL_WIDTH - 11, NumberRange(0, CELL_HEIGHT))); + addLine(PredefinedLine::EXTENDER_LINE, + horizontalLine(0, NumberRange(-EXTENDER_WIDTH - KEY_ICON_WIDTH, 0))); + + // + // Dimensions + // + addDimension(PredefinedDimension::LAYER, CELL_WIDTH); + addDimension(PredefinedDimension::FRAME, CELL_HEIGHT); + addDimension(PredefinedDimension::INDEX, 0); + addDimension(PredefinedDimension::SOUND_AMPLITUDE, + int(sqrt(CELL_HEIGHT * soundRect.width()) / 2)); + addDimension(PredefinedDimension::FRAME_LABEL_ALIGN, Qt::AlignCenter); + addDimension(PredefinedDimension::ONION_TURN, 0); + addDimension(PredefinedDimension::QBOXLAYOUT_DIRECTION, + QBoxLayout::Direction::TopToBottom); + addDimension(PredefinedDimension::CENTER_ALIGN, Qt::AlignHCenter); + + // + // Paths + // + QPainterPath corner(QPointF(0, CELL_HEIGHT)); + corner.lineTo(QPointF(CELL_DRAG_WIDTH, CELL_HEIGHT)); + corner.lineTo(QPointF(CELL_DRAG_WIDTH, CELL_HEIGHT - CELL_DRAG_WIDTH)); + corner.lineTo(QPointF(0, CELL_HEIGHT)); + addPath(PredefinedPath::DRAG_HANDLE_CORNER, corner); + + QPainterPath fromTriangle(QPointF(0, EASE_TRIANGLE_SIZE / 2)); + fromTriangle.lineTo(QPointF(EASE_TRIANGLE_SIZE, -EASE_TRIANGLE_SIZE / 2)); + fromTriangle.lineTo(QPointF(-EASE_TRIANGLE_SIZE, -EASE_TRIANGLE_SIZE / 2)); + fromTriangle.lineTo(QPointF(0, EASE_TRIANGLE_SIZE / 2)); + fromTriangle.translate(keyRect.center()); + addPath(PredefinedPath::BEGIN_EASE_TRIANGLE, fromTriangle); + + QPainterPath toTriangle(QPointF(0, -EASE_TRIANGLE_SIZE / 2)); + toTriangle.lineTo(QPointF(EASE_TRIANGLE_SIZE, EASE_TRIANGLE_SIZE / 2)); + toTriangle.lineTo(QPointF(-EASE_TRIANGLE_SIZE, EASE_TRIANGLE_SIZE / 2)); + toTriangle.lineTo(QPointF(0, -EASE_TRIANGLE_SIZE / 2)); + toTriangle.translate(keyRect.center()); + addPath(PredefinedPath::END_EASE_TRIANGLE, toTriangle); + + QPainterPath playFrom(QPointF(0, 0)); + playFrom.lineTo(QPointF(PLAY_MARKER_SIZE, 0)); + playFrom.lineTo(QPointF(0, PLAY_MARKER_SIZE)); + playFrom.lineTo(QPointF(0, 0)); + playFrom.translate(PLAY_RANGE_X, 1); + addPath(PredefinedPath::BEGIN_PLAY_RANGE, playFrom); + + QPainterPath playTo(QPointF(0, 0)); + playTo.lineTo(QPointF(PLAY_MARKER_SIZE, 0)); + playTo.lineTo(QPointF(0, -PLAY_MARKER_SIZE)); + playTo.lineTo(QPointF(0, 0)); + playTo.translate(PLAY_RANGE_X, CELL_HEIGHT - 1); + addPath(PredefinedPath::END_PLAY_RANGE, playTo); + + QPainterPath track(QPointF(0, 0)); + track.lineTo(QPointF(1, 1)); + track.lineTo(QPointF(1, trackLen - 1)); + track.lineTo(QPointF(0, trackLen)); + track.lineTo(QPointF(-1, trackLen - 1)); + track.lineTo(QPointF(-1, 1)); + track.lineTo(QPointF(0, 0)); + track.translate(soundTopLeft); + addPath(PredefinedPath::VOLUME_SLIDER_TRACK, track); + + QPainterPath head(QPointF(0, 0)); + head.lineTo(QPointF(4, 4)); + head.lineTo(QPointF(8, 4)); + head.lineTo(QPointF(8, -4)); + head.lineTo(QPointF(4, -4)); + head.lineTo(QPointF(0, 0)); + addPath(PredefinedPath::VOLUME_SLIDER_HEAD, head); + + // + // Points + // + addPoint(PredefinedPoint::KEY_HIDDEN, QPoint(KEY_ICON_WIDTH, 0)); + addPoint(PredefinedPoint::EXTENDER_XY_RADIUS, QPoint(30, 75)); + addPoint(PredefinedPoint::VOLUME_DIVISIONS_TOP_LEFT, + soundTopLeft - QPoint(5, 0)); + + // + // Ranges + // + addRange(PredefinedRange::HEADER_LAYER, NumberRange(0, FRAME_HEADER_WIDTH)); + addRange(PredefinedRange::HEADER_FRAME, NumberRange(0, LAYER_HEADER_HEIGHT)); +} + +CellPosition TopToBottomOrientation::xyToPosition(const QPoint &xy, + const ColumnFan *fan) const { + int layer = fan->layerAxisToCol(xy.x()); + int frame = xy.y() / CELL_HEIGHT; + return CellPosition(frame, layer); +} +QPoint TopToBottomOrientation::positionToXY(const CellPosition &position, + const ColumnFan *fan) const { + int x = colToLayerAxis(position.layer(), fan); + int y = rowToFrameAxis(position.frame()); + return QPoint(x, y); +} +CellPositionRatio TopToBottomOrientation::xyToPositionRatio( + const QPoint &xy) const { + Ratio frame{xy.y(), CELL_HEIGHT}; + Ratio layer{xy.x(), CELL_WIDTH}; + return CellPositionRatio{frame, layer}; +} +QPoint TopToBottomOrientation::positionRatioToXY( + const CellPositionRatio &ratio) const { + int x = ratio.layer() * CELL_WIDTH; + int y = ratio.frame() * CELL_HEIGHT; + return QPoint(x, y); +} + +int TopToBottomOrientation::colToLayerAxis(int layer, + const ColumnFan *fan) const { + return fan->colToLayerAxis(layer); +} +int TopToBottomOrientation::rowToFrameAxis(int frame) const { + return frame * CELL_HEIGHT; +} +QPoint TopToBottomOrientation::frameLayerToXY(int frameAxis, + int layerAxis) const { + return QPoint(layerAxis, frameAxis); +} +int TopToBottomOrientation::layerAxis(const QPoint &xy) const { return xy.x(); } +int TopToBottomOrientation::frameAxis(const QPoint &xy) const { return xy.y(); } +NumberRange TopToBottomOrientation::layerSide(const QRect &area) const { + return NumberRange(area.left(), area.right()); +} +NumberRange TopToBottomOrientation::frameSide(const QRect &area) const { + return NumberRange(area.top(), area.bottom()); +} +QPoint TopToBottomOrientation::topRightCorner(const QRect &area) const { + return area.topRight(); +} + +CellPosition TopToBottomOrientation::arrowShift(int direction) const { + switch (direction) { + case Qt::Key_Up: + return CellPosition(-1, 0); + case Qt::Key_Down: + return CellPosition(1, 0); + case Qt::Key_Left: + return CellPosition(0, -1); + case Qt::Key_Right: + return CellPosition(0, 1); + default: + return CellPosition(0, 0); + } +} + +/// -------------------------------------------------------------------------------- + +LeftToRightOrientation::LeftToRightOrientation() { + // + // Ranges + // + + // Cell viewer + QRect cellRect(0, 0, CELL_WIDTH, CELL_HEIGHT); + addRect(PredefinedRect::CELL, cellRect); + addRect(PredefinedRect::DRAG_HANDLE_CORNER, + QRect(0, 0, CELL_WIDTH, CELL_DRAG_HEIGHT)); + QRect keyRect((CELL_WIDTH - KEY_ICON_WIDTH) / 2, + CELL_HEIGHT - KEY_ICON_HEIGHT, KEY_ICON_WIDTH, KEY_ICON_HEIGHT); + addRect(PredefinedRect::KEY_ICON, keyRect); + QRect nameRect = cellRect.adjusted(4, 4, -6, 0); + addRect(PredefinedRect::CELL_NAME, nameRect); + addRect(PredefinedRect::CELL_NAME_WITH_KEYFRAME, nameRect); + addRect(PredefinedRect::END_EXTENDER, + QRect(0, -EXTENDER_HEIGHT - 10, EXTENDER_WIDTH, EXTENDER_HEIGHT)); + addRect(PredefinedRect::BEGIN_EXTENDER, + QRect(-EXTENDER_WIDTH, -EXTENDER_HEIGHT - 10, EXTENDER_WIDTH, + EXTENDER_HEIGHT)); + addRect(PredefinedRect::KEYFRAME_AREA, keyRect); + addRect(PredefinedRect::DRAG_AREA, QRect(0, 0, CELL_WIDTH, CELL_DRAG_HEIGHT)); + QRect soundRect(0, CELL_DRAG_HEIGHT, CELL_WIDTH, + CELL_HEIGHT - CELL_DRAG_HEIGHT - SOUND_PREVIEW_HEIGHT); + addRect(PredefinedRect::SOUND_TRACK, soundRect); + addRect(PredefinedRect::PREVIEW_TRACK, + QRect(0, CELL_HEIGHT - SOUND_PREVIEW_HEIGHT + 1, CELL_WIDTH, + SOUND_PREVIEW_HEIGHT)); + addRect(PredefinedRect::BEGIN_SOUND_EDIT, + QRect(0, CELL_DRAG_HEIGHT, 2, CELL_HEIGHT - CELL_DRAG_HEIGHT)); + addRect(PredefinedRect::END_SOUND_EDIT, + QRect(CELL_WIDTH - 2, CELL_DRAG_HEIGHT, 2, + CELL_HEIGHT - CELL_DRAG_HEIGHT)); + addRect(PredefinedRect::LOOP_ICON, QRect(0, keyRect.top(), 10, 11)); + + // Notes viewer + addRect( + PredefinedRect::NOTE_AREA, + QRect(QPoint(0, 0), QSize(LAYER_HEADER_WIDTH - 1, FRAME_HEADER_HEIGHT))); + addRect(PredefinedRect::NOTE_ICON, + QRect(QPoint(0, 0), QSize(CELL_WIDTH - 2, CELL_HEIGHT - 2))); + addRect(PredefinedRect::LAYER_HEADER_PANEL, + QRect(0, FRAME_HEADER_HEIGHT - CELL_HEIGHT, LAYER_HEADER_WIDTH, + CELL_HEIGHT)); + + // Row viewer + addRect(PredefinedRect::FRAME_LABEL, + QRect(CELL_WIDTH / 4, 1, CELL_WIDTH / 2, FRAME_HEADER_HEIGHT - 2)); + addRect(PredefinedRect::FRAME_HEADER, + QRect(0, 0, CELL_WIDTH, FRAME_HEADER_HEIGHT - 1)); + addRect(PredefinedRect::PLAY_RANGE, + QRect(0, PLAY_RANGE_Y, CELL_WIDTH, PLAY_MARKER_SIZE)); + addRect(PredefinedRect::ONION, + QRect(ONION_X, ONION_Y + (3 * ONION_DOT_SIZE - ONION_SIZE) / 2, + ONION_SIZE, ONION_SIZE)); + int adjustOnion = (ONION_SIZE - ONION_DOT_SIZE) / 2; + addRect(PredefinedRect::ONION_DOT, + QRect(ONION_X + adjustOnion, ONION_Y + ONION_DOT_SIZE, ONION_DOT_SIZE, + ONION_DOT_SIZE)); + addRect( + PredefinedRect::ONION_DOT_FIXED, + QRect(ONION_X + adjustOnion, ONION_Y, ONION_DOT_SIZE, ONION_DOT_SIZE)); + addRect(PredefinedRect::ONION_AREA, + QRect(ONION_X, ONION_Y, CELL_WIDTH, ONION_SIZE)); + addRect(PredefinedRect::ONION_FIXED_DOT_AREA, + QRect(ONION_X, ONION_Y, CELL_WIDTH, ONION_DOT_SIZE)); + addRect(PredefinedRect::ONION_DOT_AREA, + QRect(ONION_X, ONION_Y + ONION_DOT_SIZE, CELL_WIDTH, ONION_DOT_SIZE)); + addRect( + PredefinedRect::PINNED_CENTER_KEY, + QRect((CELL_WIDTH - PINNED_SIZE) / 2, + (FRAME_HEADER_HEIGHT - PINNED_SIZE) / 2, PINNED_SIZE, PINNED_SIZE)); + + // Column viewer + addRect(PredefinedRect::LAYER_HEADER, + QRect(1, 0, LAYER_HEADER_WIDTH - 3, CELL_HEIGHT)); + addRect( + PredefinedRect::FOLDED_LAYER_HEADER, + QRect(1, 0, FOLDED_LAYER_HEADER_WIDTH - 3, FOLDED_LAYER_HEADER_HEIGHT)); + QRect columnName(ICONS_WIDTH + 1, 0, + LAYER_NAME_WIDTH + LAYER_NUMBER_WIDTH - 3, CELL_HEIGHT); + addRect(PredefinedRect::RENAME_COLUMN, columnName); + QRect eye(1, 0, ICON_WIDTH, CELL_HEIGHT); + addRect(PredefinedRect::EYE_AREA, eye); + addRect(PredefinedRect::EYE, eye.adjusted(1, 1, 0, 0)); + addRect(PredefinedRect::PREVIEW_LAYER_AREA, eye.translated(ICON_OFFSET, 0)); + addRect(PredefinedRect::PREVIEW_LAYER, + eye.translated(ICON_OFFSET + 1, 0).adjusted(-1, 1, -1, 0)); + addRect(PredefinedRect::LOCK_AREA, eye.translated(2 * ICON_OFFSET, 0)); + addRect(PredefinedRect::LOCK, + eye.translated(2 * ICON_OFFSET + 1, 0).adjusted(-1, 1, -1, 0)); + addRect(PredefinedRect::DRAG_LAYER, + QRect(ICONS_WIDTH + 1, 0, LAYER_HEADER_WIDTH - ICONS_WIDTH - 3, + CELL_DRAG_HEIGHT)); + addRect(PredefinedRect::LAYER_NAME, columnName); + addRect(PredefinedRect::LAYER_NUMBER, + QRect(ICONS_WIDTH + 1, 0, LAYER_NUMBER_WIDTH, CELL_HEIGHT)); + addRect(PredefinedRect::THUMBNAIL_AREA, QRect(0, 0, -1, -1)); // hide + addRect(PredefinedRect::FILTER_COLOR, + QRect(LAYER_HEADER_WIDTH - 17, 6, 12, 12)); + addRect(PredefinedRect::PEGBAR_NAME, QRect(0, 0, -1, -1)); // hide + addRect(PredefinedRect::PARENT_HANDLE_NAME, QRect(0, 0, -1, -1)); // hide + + int trackLen = 60; + QRect volumeArea( + QRect(columnName.topRight(), QSize(trackLen + 8, columnName.height())) + .adjusted(-97, 0, -97, 0)); + addRect(PredefinedRect::VOLUME_AREA, volumeArea); + QPoint soundTopLeft(volumeArea.left() + 4, volumeArea.top() + 12); + addRect(PredefinedRect::VOLUME_TRACK, + QRect(soundTopLeft, QSize(trackLen, 3))); + addRect(PredefinedRect::SOUND_ICON, + QRect(columnName.topRight(), QSize(27, columnName.height())) + .adjusted(-28, 0, -28, 0)); + + // + // Lines + // + addLine(PredefinedLine::LOCKED, + verticalLine(CELL_DRAG_HEIGHT / 2, NumberRange(0, CELL_WIDTH))); + addLine(PredefinedLine::SEE_MARKER_THROUGH, + horizontalLine(0, NumberRange(0, CELL_DRAG_HEIGHT))); + addLine(PredefinedLine::CONTINUE_LEVEL, + verticalLine(CELL_HEIGHT / 2, NumberRange(0, CELL_WIDTH))); + addLine(PredefinedLine::CONTINUE_LEVEL_WITH_NAME, + verticalLine(CELL_HEIGHT / 2, NumberRange(0, CELL_WIDTH))); + addLine(PredefinedLine::EXTENDER_LINE, + horizontalLine(0, NumberRange(-EXTENDER_WIDTH - KEY_ICON_WIDTH, 0))); + + // + // Dimensions + // + addDimension(PredefinedDimension::LAYER, CELL_HEIGHT); + addDimension(PredefinedDimension::FRAME, CELL_WIDTH); + addDimension(PredefinedDimension::INDEX, 1); + addDimension(PredefinedDimension::SOUND_AMPLITUDE, soundRect.height() / 2); + addDimension(PredefinedDimension::FRAME_LABEL_ALIGN, + Qt::AlignHCenter | Qt::AlignBottom | Qt::TextWordWrap); + addDimension(PredefinedDimension::ONION_TURN, 90); + addDimension(PredefinedDimension::QBOXLAYOUT_DIRECTION, + QBoxLayout::Direction::LeftToRight); + addDimension(PredefinedDimension::CENTER_ALIGN, Qt::AlignVCenter); + + // + // Paths + // + QPainterPath corner(QPointF(CELL_WIDTH, 0)); + corner.lineTo(QPointF(CELL_WIDTH, CELL_DRAG_HEIGHT)); + corner.lineTo(QPointF(CELL_WIDTH - CELL_DRAG_HEIGHT, CELL_DRAG_HEIGHT)); + corner.lineTo(QPointF(CELL_WIDTH, 0)); + addPath(PredefinedPath::DRAG_HANDLE_CORNER, corner); + + QPainterPath fromTriangle(QPointF(EASE_TRIANGLE_SIZE / 2, 0)); + fromTriangle.lineTo(QPointF(-EASE_TRIANGLE_SIZE / 2, EASE_TRIANGLE_SIZE)); + fromTriangle.lineTo(QPointF(-EASE_TRIANGLE_SIZE / 2, -EASE_TRIANGLE_SIZE)); + fromTriangle.lineTo(QPointF(EASE_TRIANGLE_SIZE / 2, 0)); + fromTriangle.translate(keyRect.center()); + addPath(PredefinedPath::BEGIN_EASE_TRIANGLE, fromTriangle); + + QPainterPath toTriangle(QPointF(-EASE_TRIANGLE_SIZE / 2, 0)); + toTriangle.lineTo(QPointF(EASE_TRIANGLE_SIZE / 2, EASE_TRIANGLE_SIZE)); + toTriangle.lineTo(QPointF(EASE_TRIANGLE_SIZE / 2, -EASE_TRIANGLE_SIZE)); + toTriangle.lineTo(QPointF(-EASE_TRIANGLE_SIZE / 2, 0)); + toTriangle.translate(keyRect.center()); + addPath(PredefinedPath::END_EASE_TRIANGLE, toTriangle); + + QPainterPath playFrom(QPointF(0, 0)); + playFrom.lineTo(QPointF(PLAY_MARKER_SIZE, 0)); + playFrom.lineTo(QPointF(0, PLAY_MARKER_SIZE)); + playFrom.lineTo(QPointF(0, 0)); + playFrom.translate(1, PLAY_RANGE_Y); + addPath(PredefinedPath::BEGIN_PLAY_RANGE, playFrom); + + QPainterPath playTo(QPointF(0, 0)); + playTo.lineTo(QPointF(-PLAY_MARKER_SIZE, 0)); + playTo.lineTo(QPointF(0, PLAY_MARKER_SIZE)); + playTo.lineTo(QPointF(0, 0)); + playTo.translate(CELL_WIDTH - 1, PLAY_RANGE_Y); + addPath(PredefinedPath::END_PLAY_RANGE, playTo); + + QPainterPath track(QPointF(0, 0)); + track.lineTo(QPointF(1, 1)); + track.lineTo(QPointF(trackLen - 1, 1)); + track.lineTo(QPointF(trackLen, 0)); + track.lineTo(QPointF(trackLen - 1, -1)); + track.lineTo(QPointF(1, -1)); + track.lineTo(QPointF(0, 0)); + track.translate(soundTopLeft); + addPath(PredefinedPath::VOLUME_SLIDER_TRACK, track); + + QPainterPath head(QPointF(0, 0)); + head.lineTo(QPointF(4, -4)); + head.lineTo(QPointF(4, -8)); + head.lineTo(QPointF(-4, -8)); + head.lineTo(QPointF(-4, -4)); + head.lineTo(QPointF(0, 0)); + addPath(PredefinedPath::VOLUME_SLIDER_HEAD, head); + + // + // Points + // + addPoint(PredefinedPoint::KEY_HIDDEN, QPoint(0, 10)); + addPoint(PredefinedPoint::EXTENDER_XY_RADIUS, QPoint(75, 30)); + addPoint(PredefinedPoint::VOLUME_DIVISIONS_TOP_LEFT, + soundTopLeft + QPoint(0, 3)); + + // + // Ranges + // + addRange(PredefinedRange::HEADER_LAYER, NumberRange(0, FRAME_HEADER_HEIGHT)); + addRange(PredefinedRange::HEADER_FRAME, NumberRange(0, LAYER_HEADER_WIDTH)); +} + +CellPosition LeftToRightOrientation::xyToPosition(const QPoint &xy, + const ColumnFan *fan) const { + int layer = fan->layerAxisToCol(xy.y()); + int frame = xy.x() / CELL_WIDTH; + return CellPosition(frame, layer); +} +QPoint LeftToRightOrientation::positionToXY(const CellPosition &position, + const ColumnFan *fan) const { + int y = colToLayerAxis(position.layer(), fan); + int x = rowToFrameAxis(position.frame()); + return QPoint(x, y); +} +CellPositionRatio LeftToRightOrientation::xyToPositionRatio( + const QPoint &xy) const { + Ratio frame{xy.x(), CELL_WIDTH}; + Ratio layer{xy.y(), CELL_HEIGHT}; + return CellPositionRatio{frame, layer}; +} +QPoint LeftToRightOrientation::positionRatioToXY( + const CellPositionRatio &ratio) const { + int x = ratio.frame() * CELL_WIDTH; + int y = ratio.layer() * CELL_HEIGHT; + return QPoint(x, y); +} + +int LeftToRightOrientation::colToLayerAxis(int layer, + const ColumnFan *fan) const { + return fan->colToLayerAxis(layer); +} +int LeftToRightOrientation::rowToFrameAxis(int frame) const { + return frame * CELL_WIDTH; +} +QPoint LeftToRightOrientation::frameLayerToXY(int frameAxis, + int layerAxis) const { + return QPoint(frameAxis, layerAxis); +} +int LeftToRightOrientation::layerAxis(const QPoint &xy) const { return xy.y(); } +int LeftToRightOrientation::frameAxis(const QPoint &xy) const { return xy.x(); } +NumberRange LeftToRightOrientation::layerSide(const QRect &area) const { + return NumberRange(area.top(), area.bottom()); +} +NumberRange LeftToRightOrientation::frameSide(const QRect &area) const { + return NumberRange(area.left(), area.right()); +} +QPoint LeftToRightOrientation::topRightCorner(const QRect &area) const { + return area.bottomLeft(); +} +CellPosition LeftToRightOrientation::arrowShift(int direction) const { + switch (direction) { + case Qt::Key_Up: + return CellPosition(0, -1); + case Qt::Key_Down: + return CellPosition(0, 1); + case Qt::Key_Left: + return CellPosition(-1, 0); + case Qt::Key_Right: + return CellPosition(1, 0); + default: + return CellPosition(0, 0); + } +} diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index 9df1d7b..a2f92a7 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -310,9 +310,11 @@ Preferences::Preferences() , m_useNumpadForSwitchingStyles(true) , m_showXSheetToolbar(false) , m_expandFunctionHeader(false) + , m_showColumnNumbers(false) , m_useArrowKeyToShiftCellSelection(false) , m_inputCellsWithoutDoubleClickingEnabled(false) , m_importPolicy(0) + , m_ignoreImageDpi(false) , m_watchFileSystem(true) { TCamera camera; m_defLevelType = PLI_XSHLEVEL; @@ -545,7 +547,7 @@ Preferences::Preferences() getValue(*m_settings, "DefLevelWidth", m_defLevelWidth); getValue(*m_settings, "DefLevelHeight", m_defLevelHeight); getValue(*m_settings, "DefLevelDpi", m_defLevelDpi); - + getValue(*m_settings, "IgnoreImageDpi", m_ignoreImageDpi); getValue(*m_settings, "viewerBGColor", m_viewerBGColor); getValue(*m_settings, "previewBGColor", m_previewBGColor); getValue(*m_settings, "chessboardColor1", m_chessboardColor1); @@ -589,6 +591,7 @@ Preferences::Preferences() m_useNumpadForSwitchingStyles); getValue(*m_settings, "showXSheetToolbar", m_showXSheetToolbar); getValue(*m_settings, "expandFunctionHeader", m_expandFunctionHeader); + getValue(*m_settings, "showColumnNumbers", m_showColumnNumbers); getValue(*m_settings, "useArrowKeyToShiftCellSelection", m_useArrowKeyToShiftCellSelection); getValue(*m_settings, "inputCellsWithoutDoubleClickingEnabled", @@ -1272,6 +1275,13 @@ void Preferences::setDefLevelDpi(double dpi) { //----------------------------------------------------------------- +void Preferences::setIgnoreImageDpi(bool on) { + m_ignoreImageDpi = on; + m_settings->setValue("IgnoreImageDpi", on ? "1" : "0"); +} + +//----------------------------------------------------------------- + void Preferences::setPaletteTypeOnLoadRasterImageAsColorModel(int type) { m_paletteTypeOnLoadRasterImageAsColorModel = type; m_settings->setValue("paletteTypeOnLoadRasterImageAsColorModel", type); @@ -1389,6 +1399,11 @@ void Preferences::enableExpandFunctionHeader(bool on) { m_settings->setValue("expandFunctionHeader", on ? "1" : "0"); } +void Preferences::enableShowColumnNumbers(bool on) { + m_showColumnNumbers = on; + m_settings->setValue("showColumnNumbers", on ? "1" : "0"); +} + //----------------------------------------------------------------- void Preferences::enableUseArrowKeyToShiftCellSelection(bool on) { diff --git a/toonz/sources/toonzlib/toonzscene.cpp b/toonz/sources/toonzlib/toonzscene.cpp index a73c1b3..87d09e6 100644 --- a/toonz/sources/toonzlib/toonzscene.cpp +++ b/toonz/sources/toonzlib/toonzscene.cpp @@ -1177,7 +1177,8 @@ TXshLevel *ToonzScene::loadLevel(const TFilePath &actualPath, const TPointD &imageDpi = xl->getImageDpi(); if (imageDpi == TPointD() || - Preferences::instance()->getUnits() == "pixel") { + Preferences::instance()->getUnits() == "pixel" || + Preferences::instance()->isIgnoreImageDpiEnabled()) { // Change to "Custom Dpi" policy and use camera dpi TStageObjectId cameraId = getXsheet()->getStageObjectTree()->getCurrentCameraId(); diff --git a/toonz/sources/toonzlib/txsheet.cpp b/toonz/sources/toonzlib/txsheet.cpp index 607b77a..3377cb7 100644 --- a/toonz/sources/toonzlib/txsheet.cpp +++ b/toonz/sources/toonzlib/txsheet.cpp @@ -31,6 +31,7 @@ #include "toonz/stage.h" #include "toonz/textureutils.h" #include "xshhandlemanager.h" +#include "orientation.h" #include "toonz/txsheet.h" @@ -92,7 +93,7 @@ struct TXsheet::TXsheetImp { int m_viewColumn; TSoundTrackP m_mixedSound; - ColumnFan m_columnFan; + ColumnFan m_columnFans[Orientations::COUNT]; XshHandleManager *m_handleManager; ToonzScene *m_scene; @@ -105,7 +106,11 @@ public: return ++currentId; } + void copyFoldedState(); + private: + void initColumnFans(); + // not implemented TXsheetImp(const TXsheetImp &); TXsheetImp &operator=(const TXsheetImp &); @@ -144,7 +149,9 @@ TXsheet::TXsheetImp::TXsheetImp() , m_soloColumn(-1) , m_viewColumn(-1) , m_mixedSound(0) - , m_scene(0) {} + , m_scene(0) { + initColumnFans(); +} //----------------------------------------------------------------------------- @@ -157,6 +164,20 @@ TXsheet::TXsheetImp::~TXsheetImp() { delete m_handleManager; } +//----------------------------------------------------------------------------- + +void TXsheet::TXsheetImp::initColumnFans() { + for (auto o : Orientations::all()) { + int index = o->dimension(PredefinedDimension::INDEX); + m_columnFans[index].setDimension(o->dimension(PredefinedDimension::LAYER)); + } +} + +void TXsheet::TXsheetImp::copyFoldedState() { + for (int i = 1; i < Orientations::COUNT; i++) + m_columnFans[i].copyFoldedStateFrom(m_columnFans[0]); +} + //============================================================================= // TXsheet @@ -193,12 +214,17 @@ int TXsheet::getFrameCount() const { return m_imp->m_frameCount; } //----------------------------------------------------------------------------- const TXshCell &TXsheet::getCell(int row, int col) const { + return getCell(CellPosition(row, col)); +} + +const TXshCell &TXsheet::getCell(const CellPosition &pos) const { static const TXshCell emptyCell; - TXshColumnP column = m_imp->m_columnSet.getColumn(col); + + TXshColumnP column = m_imp->m_columnSet.getColumn(pos.layer()); if (!column) return emptyCell; TXshCellColumn *xshColumn = column->getCellColumn(); if (!xshColumn) return emptyCell; - return xshColumn->getCell(row); + return xshColumn->getCell(pos.frame()); } //----------------------------------------------------------------------------- @@ -590,8 +616,8 @@ void TXsheet::reverseCells(int r0, int c0, int r1, int c1) { for (int j = c0; j <= c1; j++) { int i1, i2; for (i1 = r0, i2 = r1; i1 < i2; i1++, i2--) { - TXshCell app1 = getCell(i1, j); - TXshCell app2 = getCell(i2, j); + TXshCell app1 = getCell(CellPosition(i1, j)); + TXshCell app2 = getCell(CellPosition(i2, j)); setCell(i1, j, app2); setCell(i2, j, app1); } @@ -608,7 +634,7 @@ void TXsheet::swingCells(int r0, int c0, int r1, int c1) { for (int j = c0; j <= c1; j++) { for (int i1 = r0Mod, i2 = r1 - 1; i2 >= r0; i1++, i2--) { - TXshCell cell = getCell(i2, j); + TXshCell cell = getCell(CellPosition(i2, j)); setCell(i1, j, cell); } } @@ -620,49 +646,52 @@ bool TXsheet::incrementCells(int r0, int c0, int r1, int c1, vector> &forUndo) { for (int j = c0; j <= c1; j++) { int i = r0; - while (getCell(i, j).isEmpty() && i <= r1 - 1) i++; + while (getCell(CellPosition(i, j)).isEmpty() && i <= r1 - 1) i++; for (; i <= r1 - 1; i++) { - if (getCell(i + 1, j).isEmpty()) break; - const TXshCell &ce1 = getCell(i, j), &ce2 = getCell(i + 1, j); + if (getCell(CellPosition(i + 1, j)).isEmpty()) break; + const TXshCell &ce1 = getCell(CellPosition(i, j)), + &ce2 = getCell(CellPosition(i + 1, j)); if (ce2.getSimpleLevel() != ce1.getSimpleLevel() || ce2.getFrameId().getNumber() < ce1.getFrameId().getNumber()) return false; } i = r0; - while (getCell(i, j).isEmpty() && i <= r1 - 1) i++; + while (getCell(CellPosition(i, j)).isEmpty() && i <= r1 - 1) i++; int count; for (; i <= r1 - 1; i++) { count = 1; - if (getCell(i + 1, j).isEmpty()) continue; + if (getCell(CellPosition(i + 1, j)).isEmpty()) continue; - int frame1 = getCell(i, j).getFrameId().getNumber(); + int frame1 = getCell(CellPosition(i, j)).getFrameId().getNumber(); if (frame1 == -1) break; - while (!getCell(i + 1, j).isEmpty() && - getCell(i + 1, j).getFrameId().getNumber() == - getCell(i, j).getFrameId().getNumber()) + while (!getCell(CellPosition(i + 1, j)).isEmpty() && + getCell(CellPosition(i + 1, j)).getFrameId().getNumber() == + getCell(CellPosition(i, j)).getFrameId().getNumber()) i++, count++; - int frame2 = getCell(i + 1, j).getFrameId().getNumber(); + int frame2 = getCell(CellPosition(i + 1, j)).getFrameId().getNumber(); if (frame2 == -1) break; if (frame1 + count == frame2) continue; - else if (frame1 + count < frame2) // aggiungo + else if (frame1 + count < frame2) // add { int numCells = frame2 - frame1 - count; insertCells(i + 1, j, numCells); forUndo.push_back(std::pair( TRect(i + 1, j, i + 1 + numCells - 1, j), TXshCell())); - for (int k = 1; k <= numCells; k++) setCell(i + k, j, getCell(i, j)); + for (int k = 1; k <= numCells; k++) + setCell(i + k, j, getCell(CellPosition(i, j))); i += numCells; r1 += numCells; - } else // tolgo + } else // remove { int numCells = count - frame2 + frame1; i = i - numCells; - forUndo.push_back(std::pair( - TRect(i + 1, j, i + 1 + numCells - 1, j), getCell(i + 1, j))); + forUndo.push_back( + std::pair(TRect(i + 1, j, i + 1 + numCells - 1, j), + getCell(CellPosition(i + 1, j)))); removeCells(i + 1, j, numCells); r1 -= numCells; } @@ -680,7 +709,7 @@ void TXsheet::duplicateCells(int r0, int c0, int r1, int c1, int upTo) { for (int j = c0; j <= c1; j++) { insertCells(r1 + 1, j, upTo - (r1 + 1) + 1); for (int i = r1 + 1; i <= upTo; i++) - setCell(i, j, getCell(r0 + ((i - (r1 + 1)) % chunk), j)); + setCell(i, j, getCell(CellPosition(r0 + ((i - (r1 + 1)) % chunk), j))); } } @@ -697,7 +726,7 @@ void TXsheet::stepCells(int r0, int c0, int r1, int c1, int type) { int k = 0; for (int r = r0; r <= r1; r++) for (int c = c0; c <= c1; c++) { - cells[k++] = getCell(r, c); + cells[k++] = getCell(CellPosition(r, c)); } int nrows = nr * (type - 1); @@ -726,13 +755,13 @@ void TXsheet::increaseStepCells(int r0, int c0, int &r1, int c1) { for (c = c0; c <= c1; c++) { int r = r0, i = 0, rEnd = r1; while (r <= rEnd) { - TXshCell cell = getCell(r, c); + TXshCell cell = getCell(CellPosition(r, c)); if (!cell.isEmpty()) { insertCells(r, c); setCell(r, c, cell); rEnd++; r++; - while (cell == getCell(r, c) && r <= rEnd) r++; + while (cell == getCell(CellPosition(r, c)) && r <= rEnd) r++; } else r++; i++; @@ -755,11 +784,11 @@ void TXsheet::decreaseStepCells(int r0, int c0, int &r1, int c1) { for (c = c0; c <= c1; c++) { int r = r0, i = 0, rEnd = r1; while (r <= rEnd) { - TXshCell cell = getCell(r, c); + TXshCell cell = getCell(CellPosition(r, c)); if (!cell.isEmpty()) { r++; bool removed = false; - while (cell == getCell(r, c) && r <= rEnd) { + while (cell == getCell(CellPosition(r, c)) && r <= rEnd) { if (!removed) { removed = true; removeCells(r, c); @@ -799,7 +828,7 @@ void TXsheet::eachCells(int r0, int c0, int r1, int c1, int type) { for (j = r0, i = 0; i < size; j += type) // in cells copio il contenuto delle celle che mi interessano { - for (k = c0; k <= c1; k++, i++) cells[i] = getCell(j, k); + for (k = c0; k <= c1; k++, i++) cells[i] = getCell(CellPosition(j, k)); } int c; @@ -831,8 +860,8 @@ int TXsheet::reframeCells(int r0, int r1, int col, int type) { cells.clear(); for (int r = r0; r <= r1; r++) { - if (cells.size() == 0 || cells.last() != getCell(r, col)) - cells.push_back(getCell(r, col)); + if (cells.size() == 0 || cells.last() != getCell(CellPosition(r, col))) + cells.push_back(getCell(CellPosition(r, col))); } if (cells.empty()) return 0; @@ -871,9 +900,9 @@ void TXsheet::resetStepCells(int r0, int c0, int r1, int c1) { TXshCell *cells = new TXshCell[size]; while (r <= r1) { // mi prendo le celle che mi servono - cells[i] = getCell(r, c); + cells[i] = getCell(CellPosition(r, c)); r++; - while (cells[i] == getCell(r, c) && r <= r1) r++; + while (cells[i] == getCell(CellPosition(r, c)) && r <= r1) r++; i++; } @@ -899,7 +928,7 @@ void TXsheet::rollupCells(int r0, int c0, int r1, int c1) { // in cells copio il contenuto delle celle che mi interessano int k; - for (k = c0; k <= c1; k++) cells[k - c0] = getCell(r0, k); + for (k = c0; k <= c1; k++) cells[k - c0] = getCell(CellPosition(r0, k)); for (k = c0; k <= c1; k++) removeCells(r0, k, 1); @@ -922,7 +951,7 @@ void TXsheet::rolldownCells(int r0, int c0, int r1, int c1) { // in cells copio il contenuto delle celle che mi interessano int k; - for (k = c0; k <= c1; k++) cells[k - c0] = getCell(r1, k); + for (k = c0; k <= c1; k++) cells[k - c0] = getCell(CellPosition(r1, k)); for (k = c0; k <= c1; k++) removeCells(r1, k, 1); @@ -1188,7 +1217,8 @@ void TXsheet::loadData(TIStream &is) { TFxSet fxSet; fxSet.loadData(is); } else if (tagName == "columnFan") { - m_imp->m_columnFan.loadData(is); + m_imp->m_columnFans[0].loadData(is); + m_imp->copyFoldedState(); } else if (tagName == "noteSet") { m_notes->loadData(is); } else { @@ -1218,7 +1248,8 @@ void TXsheet::saveData(TOStream &os) { fxDag->saveData(os, getFirstFreeColumnIndex()); os.closeChild(); - ColumnFan *columnFan = getColumnFan(); + // does not matter which Orientation to take, as all fans share folded data + ColumnFan *columnFan = getColumnFan(Orientations::topToBottom()); if (!columnFan->isEmpty()) { os.openChild("columnFan"); columnFan->saveData(os); @@ -1439,7 +1470,10 @@ FxDag *TXsheet::getFxDag() const { return m_imp->m_fxDag; } //----------------------------------------------------------------------------- -ColumnFan *TXsheet::getColumnFan() const { return &m_imp->m_columnFan; } +ColumnFan *TXsheet::getColumnFan(const Orientation *o) const { + int index = o->dimension(PredefinedDimension::INDEX); + return &m_imp->m_columnFans[index]; +} //----------------------------------------------------------------------------- @@ -1504,7 +1538,7 @@ TRectD TXsheet::getBBox(int r) const { struct locals { static TRectD getBBox(const TXsheet *xsh, int r, int c) { // Discriminate cell content - const TXshCell &cell = xsh->getCell(r, c); + const TXshCell &cell = xsh->getCell(CellPosition(r, c)); if (cell.isEmpty()) return voidRect; if (TXshChildLevel *cl = cell.getChildLevel()) @@ -1570,11 +1604,10 @@ TRectD TXsheet::getBBox(int r) const { //----------------------------------------------------------------------- -bool TXsheet::isRectEmpty(int r0, int c0, int r1, int c1) const { - for (int r = r0; r <= r1; r++) { - for (int c = c0; c <= c1; c++) { - if (!getCell(r, c).isEmpty()) return false; - } - } +bool TXsheet::isRectEmpty(const CellPosition &pos0, + const CellPosition &pos1) const { + for (int frame = pos0.frame(); frame <= pos1.frame(); frame++) + for (int layer = pos0.layer(); layer <= pos1.layer(); layer++) + if (!getCell(CellPosition(frame, layer)).isEmpty()) return false; return true; } \ No newline at end of file diff --git a/toonz/sources/toonzlib/txshsoundlevel.cpp b/toonz/sources/toonzlib/txshsoundlevel.cpp index 0f1220d..c282db6 100644 --- a/toonz/sources/toonzlib/txshsoundlevel.cpp +++ b/toonz/sources/toonzlib/txshsoundlevel.cpp @@ -145,9 +145,13 @@ void TXshSoundLevel::saveData(TOStream &os) { //----------------------------------------------------------------------------- -void TXshSoundLevel::computeValues(int frameHeight) { +void TXshSoundLevel::computeValuesFor(const Orientation *o) { + int frameHeight = o->dimension(PredefinedDimension::FRAME); // time axis + int index = o->dimension(PredefinedDimension::INDEX); + map &values = m_values[index]; + if (frameHeight == 0) frameHeight = 1; - m_values.clear(); + values.clear(); if (!m_soundTrack) { m_frameSoundCount = 0; m_samplePerFrame = 0; @@ -174,7 +178,9 @@ void TXshSoundLevel::computeValues(int frameHeight) { if (absMaxPressure <= 0) return; // Adjusting using a fixed scaleFactor - double weightA = 20.0 / absMaxPressure; + int desiredAmplitude = o->dimension(PredefinedDimension::SOUND_AMPLITUDE); + // results will be in range -desiredAmplitude .. +desiredAmplitude + double weightA = desiredAmplitude / absMaxPressure; long i = 0, j; long p = 0; // se p parte da zero notazione per pixel, @@ -187,7 +193,7 @@ void TXshSoundLevel::computeValues(int frameHeight) { (TINT32)(i * m_samplePerFrame + j * samplePerPixel), (TINT32)(i * m_samplePerFrame + (j + 1) * samplePerPixel - 1), TSound::MONO, min, max); - m_values.insert(std::pair>( + values.insert(std::pair>( p + j, std::pair(min * weightA, max * weightA))); } @@ -196,7 +202,7 @@ void TXshSoundLevel::computeValues(int frameHeight) { m_soundTrack->getMinMaxPressure( (TINT32)(i * m_samplePerFrame + j * samplePerPixel), (TINT32)((i + 1) * m_samplePerFrame - 1), TSound::MONO, min, max); - m_values.insert(std::pair>( + values.insert(std::pair>( p + j, std::pair(min * weightA, max * weightA))); ++i; @@ -206,9 +212,17 @@ void TXshSoundLevel::computeValues(int frameHeight) { //----------------------------------------------------------------------------- -void TXshSoundLevel::getValueAtPixel(int pixel, DoublePair &values) const { - std::map::const_iterator it = m_values.find(pixel); - if (it != m_values.end()) values = it->second; +void TXshSoundLevel::computeValues() { + for (auto o : Orientations::all()) computeValuesFor(o); +} + +//----------------------------------------------------------------------------- + +void TXshSoundLevel::getValueAtPixel(const Orientation *o, int pixel, + DoublePair &values) const { + int index = o->dimension(PredefinedDimension::INDEX); + std::map::const_iterator it = m_values[index].find(pixel); + if (it != m_values[index].end()) values = it->second; } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonzqt/Resources/camera_off.png b/toonz/sources/toonzqt/Resources/camera_off.png deleted file mode 100644 index 84a4b0b..0000000 Binary files a/toonz/sources/toonzqt/Resources/camera_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/camera_off.svg b/toonz/sources/toonzqt/Resources/camera_off.svg new file mode 100644 index 0000000..c803318 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/camera_off.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/camera_on.png b/toonz/sources/toonzqt/Resources/camera_on.png deleted file mode 100644 index 560ec9f..0000000 Binary files a/toonz/sources/toonzqt/Resources/camera_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/camera_on.svg b/toonz/sources/toonzqt/Resources/camera_on.svg new file mode 100644 index 0000000..ee2b627 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/camera_on.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/centerselection_off.png b/toonz/sources/toonzqt/Resources/centerselection_off.png deleted file mode 100644 index 796bd10..0000000 Binary files a/toonz/sources/toonzqt/Resources/centerselection_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/centerselection_off.svg b/toonz/sources/toonzqt/Resources/centerselection_off.svg new file mode 100644 index 0000000..d44c273 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/centerselection_off.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/centerselection_on.png b/toonz/sources/toonzqt/Resources/centerselection_on.png deleted file mode 100644 index 5f03dd9..0000000 Binary files a/toonz/sources/toonzqt/Resources/centerselection_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/centerselection_on.svg b/toonz/sources/toonzqt/Resources/centerselection_on.svg new file mode 100644 index 0000000..bf383c2 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/centerselection_on.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/fit_off.png b/toonz/sources/toonzqt/Resources/fit_off.png deleted file mode 100644 index e69571d..0000000 Binary files a/toonz/sources/toonzqt/Resources/fit_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/fit_off.svg b/toonz/sources/toonzqt/Resources/fit_off.svg new file mode 100644 index 0000000..02de5ab --- /dev/null +++ b/toonz/sources/toonzqt/Resources/fit_off.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/fit_on.png b/toonz/sources/toonzqt/Resources/fit_on.png deleted file mode 100644 index 7bd55c9..0000000 Binary files a/toonz/sources/toonzqt/Resources/fit_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/fit_on.svg b/toonz/sources/toonzqt/Resources/fit_on.svg new file mode 100644 index 0000000..58228bb --- /dev/null +++ b/toonz/sources/toonzqt/Resources/fit_on.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/fx_off.png b/toonz/sources/toonzqt/Resources/fx_off.png deleted file mode 100644 index a8d3c78..0000000 Binary files a/toonz/sources/toonzqt/Resources/fx_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/fx_off.svg b/toonz/sources/toonzqt/Resources/fx_off.svg new file mode 100644 index 0000000..e2b640f --- /dev/null +++ b/toonz/sources/toonzqt/Resources/fx_off.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/fx_on.png b/toonz/sources/toonzqt/Resources/fx_on.png deleted file mode 100644 index 62d09d0..0000000 Binary files a/toonz/sources/toonzqt/Resources/fx_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/fx_on.svg b/toonz/sources/toonzqt/Resources/fx_on.svg new file mode 100644 index 0000000..9c4c0e4 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/fx_on.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/fxport_blue.png b/toonz/sources/toonzqt/Resources/fxport_blue.png deleted file mode 100644 index 45b8ddd..0000000 Binary files a/toonz/sources/toonzqt/Resources/fxport_blue.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/fxport_blue.svg b/toonz/sources/toonzqt/Resources/fxport_blue.svg new file mode 100644 index 0000000..34bf755 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/fxport_blue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/fxport_red.png b/toonz/sources/toonzqt/Resources/fxport_red.png deleted file mode 100644 index 4059f4f..0000000 Binary files a/toonz/sources/toonzqt/Resources/fxport_red.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/fxport_red.svg b/toonz/sources/toonzqt/Resources/fxport_red.svg new file mode 100644 index 0000000..ec97806 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/fxport_red.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/key_no.png b/toonz/sources/toonzqt/Resources/key_no.png deleted file mode 100644 index 4eb8454..0000000 Binary files a/toonz/sources/toonzqt/Resources/key_no.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/key_no.svg b/toonz/sources/toonzqt/Resources/key_no.svg new file mode 100644 index 0000000..79a7b6c --- /dev/null +++ b/toonz/sources/toonzqt/Resources/key_no.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/key_no_over.png b/toonz/sources/toonzqt/Resources/key_no_over.png deleted file mode 100644 index f4443a7..0000000 Binary files a/toonz/sources/toonzqt/Resources/key_no_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/key_no_over.svg b/toonz/sources/toonzqt/Resources/key_no_over.svg new file mode 100644 index 0000000..8058085 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/key_no_over.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/key_partial.png b/toonz/sources/toonzqt/Resources/key_partial.png deleted file mode 100644 index 8d14e3d..0000000 Binary files a/toonz/sources/toonzqt/Resources/key_partial.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/key_partial.svg b/toonz/sources/toonzqt/Resources/key_partial.svg new file mode 100644 index 0000000..ad64ce9 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/key_partial.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/key_partial_over.png b/toonz/sources/toonzqt/Resources/key_partial_over.png deleted file mode 100644 index e2d88ab..0000000 Binary files a/toonz/sources/toonzqt/Resources/key_partial_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/key_partial_over.svg b/toonz/sources/toonzqt/Resources/key_partial_over.svg new file mode 100644 index 0000000..ecf94fd --- /dev/null +++ b/toonz/sources/toonzqt/Resources/key_partial_over.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/key_total.png b/toonz/sources/toonzqt/Resources/key_total.png deleted file mode 100644 index 5e5d10d..0000000 Binary files a/toonz/sources/toonzqt/Resources/key_total.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/key_total.svg b/toonz/sources/toonzqt/Resources/key_total.svg new file mode 100644 index 0000000..a64cb18 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/key_total.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/key_total_over.png b/toonz/sources/toonzqt/Resources/key_total_over.png deleted file mode 100644 index 692c1b9..0000000 Binary files a/toonz/sources/toonzqt/Resources/key_total_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/key_total_over.svg b/toonz/sources/toonzqt/Resources/key_total_over.svg new file mode 100644 index 0000000..1106352 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/key_total_over.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/lockpalette_off.png b/toonz/sources/toonzqt/Resources/lockpalette_off.png deleted file mode 100644 index 5d05f9d..0000000 Binary files a/toonz/sources/toonzqt/Resources/lockpalette_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/lockpalette_off.svg b/toonz/sources/toonzqt/Resources/lockpalette_off.svg new file mode 100644 index 0000000..ec39975 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/lockpalette_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/lockpalette_on.png b/toonz/sources/toonzqt/Resources/lockpalette_on.png deleted file mode 100644 index afc8f0d..0000000 Binary files a/toonz/sources/toonzqt/Resources/lockpalette_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/lockpalette_on.svg b/toonz/sources/toonzqt/Resources/lockpalette_on.svg new file mode 100644 index 0000000..0986299 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/lockpalette_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/lockpalette_over.png b/toonz/sources/toonzqt/Resources/lockpalette_over.png deleted file mode 100644 index afc8f0d..0000000 Binary files a/toonz/sources/toonzqt/Resources/lockpalette_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/lockpalette_over.svg b/toonz/sources/toonzqt/Resources/lockpalette_over.svg new file mode 100644 index 0000000..f60668d --- /dev/null +++ b/toonz/sources/toonzqt/Resources/lockpalette_over.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/maximizenodes_off.png b/toonz/sources/toonzqt/Resources/maximizenodes_off.png deleted file mode 100644 index 3e92404..0000000 Binary files a/toonz/sources/toonzqt/Resources/maximizenodes_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/maximizenodes_off.svg b/toonz/sources/toonzqt/Resources/maximizenodes_off.svg new file mode 100644 index 0000000..b9270ab --- /dev/null +++ b/toonz/sources/toonzqt/Resources/maximizenodes_off.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/maximizenodes_on.png b/toonz/sources/toonzqt/Resources/maximizenodes_on.png deleted file mode 100644 index e5f291a..0000000 Binary files a/toonz/sources/toonzqt/Resources/maximizenodes_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/maximizenodes_on.svg b/toonz/sources/toonzqt/Resources/maximizenodes_on.svg new file mode 100644 index 0000000..919e339 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/maximizenodes_on.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/minimizenodes_off.png b/toonz/sources/toonzqt/Resources/minimizenodes_off.png deleted file mode 100644 index e2f3352..0000000 Binary files a/toonz/sources/toonzqt/Resources/minimizenodes_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/minimizenodes_off.svg b/toonz/sources/toonzqt/Resources/minimizenodes_off.svg new file mode 100644 index 0000000..b15aafb --- /dev/null +++ b/toonz/sources/toonzqt/Resources/minimizenodes_off.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/minimizenodes_on.png b/toonz/sources/toonzqt/Resources/minimizenodes_on.png deleted file mode 100644 index 2bf581e..0000000 Binary files a/toonz/sources/toonzqt/Resources/minimizenodes_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/minimizenodes_on.svg b/toonz/sources/toonzqt/Resources/minimizenodes_on.svg new file mode 100644 index 0000000..c59471f --- /dev/null +++ b/toonz/sources/toonzqt/Resources/minimizenodes_on.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/motionpath_off.png b/toonz/sources/toonzqt/Resources/motionpath_off.png deleted file mode 100644 index aec00e2..0000000 Binary files a/toonz/sources/toonzqt/Resources/motionpath_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/motionpath_off.svg b/toonz/sources/toonzqt/Resources/motionpath_off.svg new file mode 100644 index 0000000..ee522dc --- /dev/null +++ b/toonz/sources/toonzqt/Resources/motionpath_off.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/motionpath_on.png b/toonz/sources/toonzqt/Resources/motionpath_on.png deleted file mode 100644 index cd28a55..0000000 Binary files a/toonz/sources/toonzqt/Resources/motionpath_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/motionpath_on.svg b/toonz/sources/toonzqt/Resources/motionpath_on.svg new file mode 100644 index 0000000..38e0d05 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/motionpath_on.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/newfolder.png b/toonz/sources/toonzqt/Resources/newfolder.png deleted file mode 100644 index 6826f07..0000000 Binary files a/toonz/sources/toonzqt/Resources/newfolder.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/newfolder.svg b/toonz/sources/toonzqt/Resources/newfolder.svg new file mode 100644 index 0000000..c2af7d3 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/newfolder.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/newfolder_over.png b/toonz/sources/toonzqt/Resources/newfolder_over.png deleted file mode 100644 index 7ed85a6..0000000 Binary files a/toonz/sources/toonzqt/Resources/newfolder_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/newfolder_over.svg b/toonz/sources/toonzqt/Resources/newfolder_over.svg new file mode 100644 index 0000000..51cd666 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/newfolder_over.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/newpage.png b/toonz/sources/toonzqt/Resources/newpage.png deleted file mode 100644 index a6138db..0000000 Binary files a/toonz/sources/toonzqt/Resources/newpage.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/newpage.svg b/toonz/sources/toonzqt/Resources/newpage.svg new file mode 100644 index 0000000..be2399c --- /dev/null +++ b/toonz/sources/toonzqt/Resources/newpage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/newpage_over.png b/toonz/sources/toonzqt/Resources/newpage_over.png deleted file mode 100644 index 5c775a7..0000000 Binary files a/toonz/sources/toonzqt/Resources/newpage_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/newpage_over.svg b/toonz/sources/toonzqt/Resources/newpage_over.svg new file mode 100644 index 0000000..8bbe5fa --- /dev/null +++ b/toonz/sources/toonzqt/Resources/newpage_over.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/newstyle.png b/toonz/sources/toonzqt/Resources/newstyle.png deleted file mode 100644 index 07771a8..0000000 Binary files a/toonz/sources/toonzqt/Resources/newstyle.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/newstyle.svg b/toonz/sources/toonzqt/Resources/newstyle.svg new file mode 100644 index 0000000..80e36a0 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/newstyle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/newstyle_click.png b/toonz/sources/toonzqt/Resources/newstyle_click.png deleted file mode 100644 index f8c9880..0000000 Binary files a/toonz/sources/toonzqt/Resources/newstyle_click.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/newstyle_over.png b/toonz/sources/toonzqt/Resources/newstyle_over.png deleted file mode 100644 index 8b9100c..0000000 Binary files a/toonz/sources/toonzqt/Resources/newstyle_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/newstyle_over.svg b/toonz/sources/toonzqt/Resources/newstyle_over.svg new file mode 100644 index 0000000..d3b5554 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/newstyle_over.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/nextkey.png b/toonz/sources/toonzqt/Resources/nextkey.png deleted file mode 100644 index 1f667f2..0000000 Binary files a/toonz/sources/toonzqt/Resources/nextkey.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/nextkey.svg b/toonz/sources/toonzqt/Resources/nextkey.svg new file mode 100644 index 0000000..c75177d --- /dev/null +++ b/toonz/sources/toonzqt/Resources/nextkey.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/nextkey_disabled.png b/toonz/sources/toonzqt/Resources/nextkey_disabled.png deleted file mode 100644 index ce8ccb4..0000000 Binary files a/toonz/sources/toonzqt/Resources/nextkey_disabled.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/nextkey_disabled.svg b/toonz/sources/toonzqt/Resources/nextkey_disabled.svg new file mode 100644 index 0000000..48e3673 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/nextkey_disabled.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/nextkey_over.png b/toonz/sources/toonzqt/Resources/nextkey_over.png deleted file mode 100644 index 49b0621..0000000 Binary files a/toonz/sources/toonzqt/Resources/nextkey_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/nextkey_over.svg b/toonz/sources/toonzqt/Resources/nextkey_over.svg new file mode 100644 index 0000000..079997c --- /dev/null +++ b/toonz/sources/toonzqt/Resources/nextkey_over.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/opacitycheck_off.png b/toonz/sources/toonzqt/Resources/opacitycheck_off.png deleted file mode 100644 index a7e8544..0000000 Binary files a/toonz/sources/toonzqt/Resources/opacitycheck_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/opacitycheck_off.svg b/toonz/sources/toonzqt/Resources/opacitycheck_off.svg new file mode 100644 index 0000000..8c3e11b --- /dev/null +++ b/toonz/sources/toonzqt/Resources/opacitycheck_off.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/opacitycheck_on.png b/toonz/sources/toonzqt/Resources/opacitycheck_on.png deleted file mode 100644 index a1569f5..0000000 Binary files a/toonz/sources/toonzqt/Resources/opacitycheck_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/opacitycheck_on.svg b/toonz/sources/toonzqt/Resources/opacitycheck_on.svg new file mode 100644 index 0000000..d512d13 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/opacitycheck_on.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/opacitycheck_over.png b/toonz/sources/toonzqt/Resources/opacitycheck_over.png deleted file mode 100644 index 59b9565..0000000 Binary files a/toonz/sources/toonzqt/Resources/opacitycheck_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/opacitycheck_over.svg b/toonz/sources/toonzqt/Resources/opacitycheck_over.svg new file mode 100644 index 0000000..38e1eb5 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/opacitycheck_over.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/options.png b/toonz/sources/toonzqt/Resources/options.png deleted file mode 100644 index 485487f..0000000 Binary files a/toonz/sources/toonzqt/Resources/options.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/options.svg b/toonz/sources/toonzqt/Resources/options.svg new file mode 100644 index 0000000..27c64c2 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/options.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/options_click.png b/toonz/sources/toonzqt/Resources/options_click.png deleted file mode 100644 index 7a96556..0000000 Binary files a/toonz/sources/toonzqt/Resources/options_click.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/options_over.png b/toonz/sources/toonzqt/Resources/options_over.png deleted file mode 100644 index b3977c4..0000000 Binary files a/toonz/sources/toonzqt/Resources/options_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/options_over.svg b/toonz/sources/toonzqt/Resources/options_over.svg new file mode 100644 index 0000000..ce64781 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/options_over.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/output_off.png b/toonz/sources/toonzqt/Resources/output_off.png deleted file mode 100644 index 6f51f7e..0000000 Binary files a/toonz/sources/toonzqt/Resources/output_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/output_off.svg b/toonz/sources/toonzqt/Resources/output_off.svg new file mode 100644 index 0000000..d38a89f --- /dev/null +++ b/toonz/sources/toonzqt/Resources/output_off.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/output_on.png b/toonz/sources/toonzqt/Resources/output_on.png deleted file mode 100644 index 03c821e..0000000 Binary files a/toonz/sources/toonzqt/Resources/output_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/output_on.svg b/toonz/sources/toonzqt/Resources/output_on.svg new file mode 100644 index 0000000..112d8b3 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/output_on.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/pegbar_off.png b/toonz/sources/toonzqt/Resources/pegbar_off.png deleted file mode 100644 index edec711..0000000 Binary files a/toonz/sources/toonzqt/Resources/pegbar_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/pegbar_off.svg b/toonz/sources/toonzqt/Resources/pegbar_off.svg new file mode 100644 index 0000000..3599836 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/pegbar_off.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/pegbar_on.png b/toonz/sources/toonzqt/Resources/pegbar_on.png deleted file mode 100644 index 600da41..0000000 Binary files a/toonz/sources/toonzqt/Resources/pegbar_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/pegbar_on.svg b/toonz/sources/toonzqt/Resources/pegbar_on.svg new file mode 100644 index 0000000..7be2bf6 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/pegbar_on.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_black_off.png b/toonz/sources/toonzqt/Resources/preview_black_off.png deleted file mode 100644 index d9f3103..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_black_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_black_off.svg b/toonz/sources/toonzqt/Resources/preview_black_off.svg new file mode 100644 index 0000000..615e914 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_black_off.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_black_on.png b/toonz/sources/toonzqt/Resources/preview_black_on.png deleted file mode 100644 index f8a8ba2..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_black_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_black_on.svg b/toonz/sources/toonzqt/Resources/preview_black_on.svg new file mode 100644 index 0000000..5b234f3 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_black_on.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_black_over.png b/toonz/sources/toonzqt/Resources/preview_black_over.png deleted file mode 100644 index b97b6d0..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_black_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_black_over.svg b/toonz/sources/toonzqt/Resources/preview_black_over.svg new file mode 100644 index 0000000..4cb4345 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_black_over.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_checkboard_off.png b/toonz/sources/toonzqt/Resources/preview_checkboard_off.png deleted file mode 100644 index 0ee69a7..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_checkboard_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_checkboard_off.svg b/toonz/sources/toonzqt/Resources/preview_checkboard_off.svg new file mode 100644 index 0000000..63d64d8 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_checkboard_off.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_checkboard_on.png b/toonz/sources/toonzqt/Resources/preview_checkboard_on.png deleted file mode 100644 index c164fc5..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_checkboard_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_checkboard_on.svg b/toonz/sources/toonzqt/Resources/preview_checkboard_on.svg new file mode 100644 index 0000000..61e188d --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_checkboard_on.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_checkboard_over.png b/toonz/sources/toonzqt/Resources/preview_checkboard_over.png deleted file mode 100644 index 90f14b8..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_checkboard_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_checkboard_over.svg b/toonz/sources/toonzqt/Resources/preview_checkboard_over.svg new file mode 100644 index 0000000..1fc153a --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_checkboard_over.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_off.png b/toonz/sources/toonzqt/Resources/preview_off.png deleted file mode 100644 index 5e173b9..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_off.svg b/toonz/sources/toonzqt/Resources/preview_off.svg new file mode 100644 index 0000000..df18116 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_off.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_on.png b/toonz/sources/toonzqt/Resources/preview_on.png deleted file mode 100644 index c6854c5..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_on.svg b/toonz/sources/toonzqt/Resources/preview_on.svg new file mode 100644 index 0000000..fb2275d --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_on.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_over.png b/toonz/sources/toonzqt/Resources/preview_over.png deleted file mode 100644 index 7205d5f..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_over.svg b/toonz/sources/toonzqt/Resources/preview_over.svg new file mode 100644 index 0000000..93d3fd7 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_over.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_white_off.png b/toonz/sources/toonzqt/Resources/preview_white_off.png deleted file mode 100644 index 49ae2d2..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_white_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_white_off.svg b/toonz/sources/toonzqt/Resources/preview_white_off.svg new file mode 100644 index 0000000..cf61b80 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_white_off.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_white_on.png b/toonz/sources/toonzqt/Resources/preview_white_on.png deleted file mode 100644 index 58cfb26..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_white_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_white_on.svg b/toonz/sources/toonzqt/Resources/preview_white_on.svg new file mode 100644 index 0000000..6740cc2 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_white_on.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/preview_white_over.png b/toonz/sources/toonzqt/Resources/preview_white_over.png deleted file mode 100644 index b811a49..0000000 Binary files a/toonz/sources/toonzqt/Resources/preview_white_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/preview_white_over.svg b/toonz/sources/toonzqt/Resources/preview_white_over.svg new file mode 100644 index 0000000..0f2cf56 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/preview_white_over.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/prevkey.png b/toonz/sources/toonzqt/Resources/prevkey.png deleted file mode 100644 index fcaaa93..0000000 Binary files a/toonz/sources/toonzqt/Resources/prevkey.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/prevkey.svg b/toonz/sources/toonzqt/Resources/prevkey.svg new file mode 100644 index 0000000..766b53d --- /dev/null +++ b/toonz/sources/toonzqt/Resources/prevkey.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/prevkey_disabled.png b/toonz/sources/toonzqt/Resources/prevkey_disabled.png deleted file mode 100644 index d8f71be..0000000 Binary files a/toonz/sources/toonzqt/Resources/prevkey_disabled.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/prevkey_disabled.svg b/toonz/sources/toonzqt/Resources/prevkey_disabled.svg new file mode 100644 index 0000000..1efc8bc --- /dev/null +++ b/toonz/sources/toonzqt/Resources/prevkey_disabled.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/prevkey_over.png b/toonz/sources/toonzqt/Resources/prevkey_over.png deleted file mode 100644 index 47a67ca..0000000 Binary files a/toonz/sources/toonzqt/Resources/prevkey_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/prevkey_over.svg b/toonz/sources/toonzqt/Resources/prevkey_over.svg new file mode 100644 index 0000000..610d1b2 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/prevkey_over.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/reorder_off.png b/toonz/sources/toonzqt/Resources/reorder_off.png deleted file mode 100644 index 99bb9ac..0000000 Binary files a/toonz/sources/toonzqt/Resources/reorder_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/reorder_off.svg b/toonz/sources/toonzqt/Resources/reorder_off.svg new file mode 100644 index 0000000..e581434 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/reorder_off.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/reorder_on.png b/toonz/sources/toonzqt/Resources/reorder_on.png deleted file mode 100644 index 04b0eb3..0000000 Binary files a/toonz/sources/toonzqt/Resources/reorder_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/reorder_on.svg b/toonz/sources/toonzqt/Resources/reorder_on.svg new file mode 100644 index 0000000..86d55ba --- /dev/null +++ b/toonz/sources/toonzqt/Resources/reorder_on.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/resetsize_off.png b/toonz/sources/toonzqt/Resources/resetsize_off.png deleted file mode 100644 index e0d102a..0000000 Binary files a/toonz/sources/toonzqt/Resources/resetsize_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/resetsize_off.svg b/toonz/sources/toonzqt/Resources/resetsize_off.svg new file mode 100644 index 0000000..23c1fe3 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/resetsize_off.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/resetsize_on.png b/toonz/sources/toonzqt/Resources/resetsize_on.png deleted file mode 100644 index f7a7a55..0000000 Binary files a/toonz/sources/toonzqt/Resources/resetsize_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/resetsize_on.svg b/toonz/sources/toonzqt/Resources/resetsize_on.svg new file mode 100644 index 0000000..124f747 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/resetsize_on.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/save.svg b/toonz/sources/toonzqt/Resources/save.svg new file mode 100644 index 0000000..94b2dc6 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/save.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/save_click.svg b/toonz/sources/toonzqt/Resources/save_click.svg new file mode 100644 index 0000000..d0a628e --- /dev/null +++ b/toonz/sources/toonzqt/Resources/save_click.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/save_over.svg b/toonz/sources/toonzqt/Resources/save_over.svg new file mode 100644 index 0000000..d0a628e --- /dev/null +++ b/toonz/sources/toonzqt/Resources/save_over.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/savepalette_off.png b/toonz/sources/toonzqt/Resources/savepalette_off.png deleted file mode 100644 index 58dcd8a..0000000 Binary files a/toonz/sources/toonzqt/Resources/savepalette_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/savepalette_off.svg b/toonz/sources/toonzqt/Resources/savepalette_off.svg new file mode 100644 index 0000000..a16d2a0 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/savepalette_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/savepalette_on.png b/toonz/sources/toonzqt/Resources/savepalette_on.png deleted file mode 100644 index 718b6d5..0000000 Binary files a/toonz/sources/toonzqt/Resources/savepalette_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/savepalette_on.svg b/toonz/sources/toonzqt/Resources/savepalette_on.svg new file mode 100644 index 0000000..b32b22e --- /dev/null +++ b/toonz/sources/toonzqt/Resources/savepalette_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/savepaletteas_off.png b/toonz/sources/toonzqt/Resources/savepaletteas_off.png deleted file mode 100644 index 89ffcf5..0000000 Binary files a/toonz/sources/toonzqt/Resources/savepaletteas_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/savepaletteas_off.svg b/toonz/sources/toonzqt/Resources/savepaletteas_off.svg new file mode 100644 index 0000000..0365afe --- /dev/null +++ b/toonz/sources/toonzqt/Resources/savepaletteas_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/savepaletteas_on.png b/toonz/sources/toonzqt/Resources/savepaletteas_on.png deleted file mode 100644 index 74b7e75..0000000 Binary files a/toonz/sources/toonzqt/Resources/savepaletteas_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/savepaletteas_on.svg b/toonz/sources/toonzqt/Resources/savepaletteas_on.svg new file mode 100644 index 0000000..834e86c --- /dev/null +++ b/toonz/sources/toonzqt/Resources/savepaletteas_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/toonz/sources/toonzqt/Resources/schematic_link.png b/toonz/sources/toonzqt/Resources/schematic_link.png deleted file mode 100644 index 3cb9e4c..0000000 Binary files a/toonz/sources/toonzqt/Resources/schematic_link.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/schematic_link.svg b/toonz/sources/toonzqt/Resources/schematic_link.svg new file mode 100644 index 0000000..3aac8f1 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/schematic_link.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/swap_off.png b/toonz/sources/toonzqt/Resources/swap_off.png deleted file mode 100644 index 6ba43b4..0000000 Binary files a/toonz/sources/toonzqt/Resources/swap_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/swap_off.svg b/toonz/sources/toonzqt/Resources/swap_off.svg new file mode 100644 index 0000000..25a1ddf --- /dev/null +++ b/toonz/sources/toonzqt/Resources/swap_off.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/swap_on.png b/toonz/sources/toonzqt/Resources/swap_on.png deleted file mode 100644 index 63b0a7e..0000000 Binary files a/toonz/sources/toonzqt/Resources/swap_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/swap_on.svg b/toonz/sources/toonzqt/Resources/swap_on.svg new file mode 100644 index 0000000..ff7441d --- /dev/null +++ b/toonz/sources/toonzqt/Resources/swap_on.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/switchport_off.png b/toonz/sources/toonzqt/Resources/switchport_off.png deleted file mode 100644 index 008a1cb..0000000 Binary files a/toonz/sources/toonzqt/Resources/switchport_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/switchport_off.svg b/toonz/sources/toonzqt/Resources/switchport_off.svg new file mode 100644 index 0000000..6237f82 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/switchport_off.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/switchport_on.png b/toonz/sources/toonzqt/Resources/switchport_on.png deleted file mode 100644 index fc23829..0000000 Binary files a/toonz/sources/toonzqt/Resources/switchport_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/switchport_on.svg b/toonz/sources/toonzqt/Resources/switchport_on.svg new file mode 100644 index 0000000..1f6a3f5 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/switchport_on.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/switchport_over.png b/toonz/sources/toonzqt/Resources/switchport_over.png deleted file mode 100644 index e403ff7..0000000 Binary files a/toonz/sources/toonzqt/Resources/switchport_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/switchport_over.svg b/toonz/sources/toonzqt/Resources/switchport_over.svg new file mode 100644 index 0000000..0e1bddc --- /dev/null +++ b/toonz/sources/toonzqt/Resources/switchport_over.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/viewcamera_off.png b/toonz/sources/toonzqt/Resources/viewcamera_off.png deleted file mode 100644 index c516071..0000000 Binary files a/toonz/sources/toonzqt/Resources/viewcamera_off.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/viewcamera_off.svg b/toonz/sources/toonzqt/Resources/viewcamera_off.svg new file mode 100644 index 0000000..f22146a --- /dev/null +++ b/toonz/sources/toonzqt/Resources/viewcamera_off.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/viewcamera_on.png b/toonz/sources/toonzqt/Resources/viewcamera_on.png deleted file mode 100644 index ddcd8a7..0000000 Binary files a/toonz/sources/toonzqt/Resources/viewcamera_on.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/viewcamera_on.svg b/toonz/sources/toonzqt/Resources/viewcamera_on.svg new file mode 100644 index 0000000..42da920 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/viewcamera_on.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/Resources/viewcamera_over.png b/toonz/sources/toonzqt/Resources/viewcamera_over.png deleted file mode 100644 index efeff9e..0000000 Binary files a/toonz/sources/toonzqt/Resources/viewcamera_over.png and /dev/null differ diff --git a/toonz/sources/toonzqt/Resources/viewcamera_over.svg b/toonz/sources/toonzqt/Resources/viewcamera_over.svg new file mode 100644 index 0000000..444f0a2 --- /dev/null +++ b/toonz/sources/toonzqt/Resources/viewcamera_over.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + diff --git a/toonz/sources/toonzqt/dvdialog.cpp b/toonz/sources/toonzqt/dvdialog.cpp index c06f481..6166f16 100644 --- a/toonz/sources/toonzqt/dvdialog.cpp +++ b/toonz/sources/toonzqt/dvdialog.cpp @@ -294,10 +294,33 @@ Dialog::Dialog(QWidget *parent, bool hasButton, bool hasFixedSize, // Therefore, if the dialog is moved to the bottom-end of the screen, // it will be got out of the screen on the next launch. // The following position adjustment will also prevent such behavior. - QRect screen = QApplication::desktop()->screenGeometry(); - int x = std::min(values.at(0).toInt(), screen.width() - 50); - int y = std::min(std::max(30, values.at(1).toInt()), screen.height() - 90); + + // try and get active screen + if (parent != NULL) { + m_currentScreen = QApplication::desktop()->screenNumber(parent); + } + QRect screen = QApplication::desktop()->availableGeometry(m_currentScreen); + int x = values.at(0).toInt(); + int y = values.at(1).toInt(); + + // make sure that the window is visible on the screen + // all popups will popup on the active window the first time + // so popups moved to other monitors will be moved back + // when restarting OpenToonz. + + // This may be somewhat annoying if a user REALLY wants the popup + // on another monitor by default, but this is better than + // a user thinking the program is broken because they didn't notice + // the popup on another monitor + if (x > screen.right() - 50) x = screen.right() - 50; + if (x < screen.left()) x = screen.left(); + if (y > screen.bottom() - 90) y = screen.bottom() - 90; + if (y < screen.top()) y = screen.top(); setGeometry(x, y, values.at(2).toInt(), values.at(3).toInt()); + m_settings->setValue(m_name, + QString::number(x) + " " + QString::number(y) + " " + + QString::number(values.at(2).toInt()) + " " + + QString::number(values.at(3).toInt())); } } @@ -342,8 +365,33 @@ void Dialog::resizeEvent(QResizeEvent *e) { //! reimplemented //! for this purpose. void Dialog::hideEvent(QHideEvent *event) { - move(pos()); + int x = pos().rx(); + int y = pos().ry(); + // make sure the dialog is actually visible on a screen + int screenCount = QApplication::desktop()->screenCount(); + int currentScreen; + for (int i = 0; i < screenCount; i++) { + if (QApplication::desktop()->screenGeometry(i).contains(pos())) { + currentScreen = i; + break; + } else { + // if not - put it back on the main window + currentScreen = m_currentScreen; + } + } + QRect screen = QApplication::desktop()->availableGeometry(currentScreen); + + if (x > screen.right() - 50) x = screen.right() - 50; + if (x < screen.left()) x = screen.left(); + if (y > screen.bottom() - 90) y = screen.bottom() - 90; + if (y < screen.top()) y = screen.top(); + move(QPoint(x, y)); resize(size()); + QRect r = geometry(); + m_settings->setValue(m_name, QString::number(r.left()) + " " + + QString::number(r.top()) + " " + + QString::number(r.width()) + " " + + QString::number(r.height())); emit dialogClosed(); } diff --git a/toonz/sources/toonzqt/flipconsole.cpp b/toonz/sources/toonzqt/flipconsole.cpp index f230afb..6afecf0 100644 --- a/toonz/sources/toonzqt/flipconsole.cpp +++ b/toonz/sources/toonzqt/flipconsole.cpp @@ -443,6 +443,7 @@ FlipConsole::FlipConsole(QVBoxLayout *mainLayout, UINT gadgetsMask, , m_framesCount(1) , m_settings() , m_fps(24) + , m_sceneFps(24) , m_isPlay(false) , m_reverse(false) , m_doubleRed(0) @@ -841,10 +842,13 @@ void FlipConsole::updateCurrentFPS(int val) { //----------------------------------------------------------------------------- -void FlipConsole::setFrameRate(int val) { - if (!m_fpsSlider) return; - m_fpsSlider->setValue(val); - setCurrentFPS(val); +void FlipConsole::setFrameRate(int val, bool forceUpdate) { + if (m_sceneFps != val || forceUpdate) { + if (!m_fpsSlider) return; + m_fpsSlider->setValue(val); + setCurrentFPS(val); + } + m_sceneFps = val; } //----------------------------------------------------------------------------- @@ -877,7 +881,7 @@ void FlipConsole::setCurrentFPS(int val) { void FlipConsole::createButton(UINT buttonMask, const char *iconStr, const QString &tip, bool checkable, QActionGroup *group) { - QIcon icon = createQIconPNG(iconStr); + QIcon icon = createQIcon(iconStr); QAction *action = new QAction(icon, tip, m_playToolBar); action->setData(QVariant(buttonMask)); action->setCheckable(checkable); @@ -891,7 +895,7 @@ void FlipConsole::createButton(UINT buttonMask, const char *iconStr, QAction *FlipConsole::createCheckedButtonWithBorderImage( UINT buttonMask, const char *iconStr, const QString &tip, bool checkable, QActionGroup *group, const char *cmdId) { - QIcon icon = createQIconPNG(iconStr); + QIcon icon = createQIcon(iconStr); QWidgetAction *action = new QWidgetAction(m_playToolBar); action->setIcon(icon); action->setToolTip(tip); @@ -923,8 +927,8 @@ QAction *FlipConsole::createDoubleButton( UINT buttonMask1, UINT buttonMask2, const char *iconStr1, const char *iconStr2, const QString &tip1, const QString &tip2, QActionGroup *group, DoubleButton *&widget) { - QAction *action1 = new QAction(createQIconPNG(iconStr1), tip1, m_playToolBar); - QAction *action2 = new QAction(createQIconPNG(iconStr2), tip2, m_playToolBar); + QAction *action1 = new QAction(createQIcon(iconStr1), tip1, m_playToolBar); + QAction *action2 = new QAction(createQIcon(iconStr2), tip2, m_playToolBar); m_actions[(EGadget)buttonMask1] = action1; m_actions[(EGadget)buttonMask2] = action2; @@ -949,7 +953,7 @@ QAction *FlipConsole::createDoubleButton( void FlipConsole::createOnOffButton(UINT buttonMask, const char *iconStr, const QString &tip, QActionGroup *group) { - QIcon icon = createQIconOnOffPNG(iconStr); + QIcon icon = createQIconOnOff(iconStr); QAction *action = new QAction(icon, tip, m_playToolBar); action->setData(QVariant(buttonMask)); action->setCheckable(true); @@ -1120,6 +1124,7 @@ void FlipConsole::createPlayToolBar(bool withCustomWidget) { m_playToolBar = new QToolBar(this); m_playToolBar->setMovable(false); m_playToolBar->setObjectName("FlipConsolePlayToolBar"); + m_playToolBar->setIconSize(QSize(17, 17)); // m_playToolBar->setObjectName("chackableButtonToolBar"); // m_playToolBar->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); @@ -1127,8 +1132,7 @@ void FlipConsole::createPlayToolBar(bool withCustomWidget) { createCustomizeMenu(withCustomWidget); if (m_gadgetsMask & eSave) { - // just reuse the icon file named "savepalette" - createButton(eSave, "savepalette", tr("&Save Images"), false); + createButton(eSave, "save", tr("&Save Images"), false); // m_saveSep = m_playToolBar->addSeparator(); } diff --git a/toonz/sources/toonzqt/framenavigator.cpp b/toonz/sources/toonzqt/framenavigator.cpp index 92985bf..56fe618 100644 --- a/toonz/sources/toonzqt/framenavigator.cpp +++ b/toonz/sources/toonzqt/framenavigator.cpp @@ -20,8 +20,10 @@ using namespace DVGui; FrameNavigator::FrameNavigator(QWidget *parent) : QToolBar(parent), m_frame(0), m_lineEdit(0), m_frameHandle(0) { setMaximumWidth(130); + setIconSize(QSize(17, 17)); + setObjectName("WidePaddingToolBar"); QAction *prevButton = - new QAction(createQIconPNG("frameprev"), tr("Previous Frame"), this); + new QAction(createQIcon("frameprev"), tr("Previous Frame"), this); connect(prevButton, SIGNAL(triggered()), this, SLOT(prevFrame())); addAction(prevButton); @@ -33,7 +35,7 @@ FrameNavigator::FrameNavigator(QWidget *parent) addWidget(m_lineEdit); QAction *nextButton = - new QAction(createQIconPNG("framenext"), tr("Next Frame"), this); + new QAction(createQIcon("framenext"), tr("Next Frame"), this); ret = ret && connect(nextButton, SIGNAL(triggered()), this, SLOT(nextFrame())); addAction(nextButton); diff --git a/toonz/sources/toonzqt/functionsheet.cpp b/toonz/sources/toonzqt/functionsheet.cpp index 9d86d2d..2f304dd 100644 --- a/toonz/sources/toonzqt/functionsheet.cpp +++ b/toonz/sources/toonzqt/functionsheet.cpp @@ -251,12 +251,10 @@ void FunctionSheetColumnHeadViewer::paintEvent(QPaintEvent *e) { QRect toBeUpdated = e->rect(); painter.setClipRect(toBeUpdated); - int x0 = toBeUpdated.left(); - int x1 = toBeUpdated.right(); - // visible columns range - int c0 = getViewer()->xToColumn(x0); - int c1 = getViewer()->xToColumn(x1); + CellRange visible = getViewer()->xyRectToRange(toBeUpdated); + int c0 = visible.from().layer(); + int c1 = visible.to().layer(); if (c0 > c1) return; @@ -264,7 +262,8 @@ void FunctionSheetColumnHeadViewer::paintEvent(QPaintEvent *e) { FunctionTreeModel::ChannelGroup *currentGroup = 0; - /*--- 表示範囲+左右1カラムの範囲で、ChannelGroupを格納。無ければ0を入れる + /*--- Display range + right and left 1 column range ChannelGroup. If there is + * none, put 0 * ---*/ std::vector channelGroups(n); for (int i = 0; i < n; ++i) { @@ -281,11 +280,11 @@ void FunctionSheetColumnHeadViewer::paintEvent(QPaintEvent *e) { } int y0 = 0; - int y1 = 17; + int y1 = 17; // needs work int y2 = 34; int y3 = 53; - /*--- Channelの有る範囲内を明るめのグレーで塗る ---*/ + /*--- Fill header with background color ---*/ for (int c = c0; c <= c1; c++) { FunctionTreeModel::Channel *channel = m_sheet->getChannel(c); if (!channel) continue; @@ -301,16 +300,18 @@ void FunctionSheetColumnHeadViewer::paintEvent(QPaintEvent *e) { FunctionTreeModel::Channel *channel = m_sheet->getChannel(c); if (!channel) continue; int i = c - c0 + 1; - /*---- 現在のColumnと前後のColumnのChannelGroup ---*/ + /*---- Channel Column of the current Column and the preceding and following + * Columns ---*/ FunctionTreeModel::ChannelGroup *prevGroup = channelGroups[c - c0], *group = channelGroups[c - c0 + 1], *nextGroup = channelGroups[c - c0 + 2]; - /*---- 前後とグループが違ってた場合、それぞれフラグを立てる ---*/ + /*---- If the group is different from the before and after, flags are set + * respectively ---*/ bool firstGroupColumn = prevGroup != group; bool lastGroupColumn = nextGroup != group; - /*--- 現在のカラムの左右座標 ---*/ + /*--- The left and right coordinates of the current column ---*/ int x0 = getViewer()->columnToX(c); int x1 = getViewer()->columnToX(c + 1) - 1; // Column width @@ -380,7 +381,7 @@ void FunctionSheetColumnHeadViewer::mouseMoveEvent(QMouseEvent *e) { } // get the column under the cursor - int col = getViewer()->xToColumn(e->pos().x()); + int col = getViewer()->xyToPosition(e->pos()).layer(); FunctionTreeModel::Channel *channel = m_sheet->getChannel(col); if (!channel) { setToolTip(QString("")); @@ -392,7 +393,7 @@ void FunctionSheetColumnHeadViewer::mouseMoveEvent(QMouseEvent *e) { void FunctionSheetColumnHeadViewer::mousePressEvent(QMouseEvent *e) { QPoint pos = e->pos(); - int currentC = getViewer()->xToColumn(pos.x()); + int currentC = getViewer()->xyToPosition(pos).layer(); FunctionTreeModel::Channel *channel; for (int c = 0; c <= m_sheet->getChannelCount(); c++) { channel = m_sheet->getChannel(c); @@ -428,7 +429,7 @@ void FunctionSheetColumnHeadViewer::mousePressEvent(QMouseEvent *e) { void FunctionSheetColumnHeadViewer::contextMenuEvent(QContextMenuEvent *ce) { // First, select column under cursor const QPoint &pos = ce->pos(); - int cursorCol = getViewer()->xToColumn(pos.x()); + int cursorCol = getViewer()->xyToPosition(pos).layer(); if (cursorCol < 0 || cursorCol >= m_sheet->getChannelCount()) return; @@ -510,10 +511,11 @@ FunctionSheetCellViewer::FunctionSheetCellViewer(FunctionSheet *parent) /*! Called when the cell panel is left/right-clicked */ Spreadsheet::DragTool *FunctionSheetCellViewer::createDragTool(QMouseEvent *e) { - int row = getViewer()->yToRow(e->pos().y()); - int col = getViewer()->xToColumn(e->pos().x()); - bool isEmpty = true; - TDoubleParam *curve = m_sheet->getCurve(col); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); + bool isEmpty = true; + TDoubleParam *curve = m_sheet->getCurve(col); if (curve) { int kCount = curve->getKeyframeCount(); if (kCount > 0) { @@ -665,8 +667,9 @@ void FunctionSheetCellViewer::drawCells(QPainter &painter, int r0, int c0, //----------------------------------------------------------------------------- void FunctionSheetCellViewer::mouseDoubleClickEvent(QMouseEvent *e) { - int row = getViewer()->yToRow(e->pos().y()); - int col = getViewer()->xToColumn(e->pos().x()); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); int x0, y0, x1, y1; x0 = getViewer()->columnToX(col); x1 = getViewer()->columnToX(col + 1) - 1; @@ -737,8 +740,6 @@ void FunctionSheetCellViewer::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton || e->button() == Qt::MidButton) Spreadsheet::CellPanel::mousePressEvent(e); else if (e->button() == Qt::RightButton) { - int row = getViewer()->yToRow(e->pos().y()); - int col = getViewer()->xToColumn(e->pos().x()); update(); openContextMenu(e); } @@ -749,8 +750,9 @@ void FunctionSheetCellViewer::mousePressEvent(QMouseEvent *e) { void FunctionSheetCellViewer::mouseReleaseEvent(QMouseEvent *e) { Spreadsheet::CellPanel::mouseReleaseEvent(e); /* -int row = getViewer()->yToRow(e->pos().y()); -int col = getViewer()->xToColumn(e->pos().x()); + CellPosition cellPosition = getViewer ()->xyToPosition (e->pos ()); +int row = cellPosition.frame (); +int col = cellPosition.layer (); FunctionSheet::DragTool *dragTool = m_sheet->getDragTool(); if(dragTool) dragTool->release(row,col); m_sheet->setDragTool(0); @@ -792,9 +794,10 @@ void FunctionSheetCellViewer::openContextMenu(QMouseEvent *e) { QAction setStep3Action(tr("Step 3"), 0); QAction setStep4Action(tr("Step 4"), 0); - int row = getViewer()->yToRow(e->pos().y()); - int col = getViewer()->xToColumn(e->pos().x()); - TDoubleParam *curve = m_sheet->getCurve(col); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); + TDoubleParam *curve = m_sheet->getCurve(col); if (!curve) return; bool isEmpty = true; @@ -947,14 +950,14 @@ void FunctionSheet::setSelection(FunctionSelection *selection) { //----------------------------------------------------------------------------- void FunctionSheet::showEvent(QShowEvent *e) { - registerFrameScroller(); + m_frameScroller.registerFrameScroller(); SpreadsheetViewer::showEvent(e); } //----------------------------------------------------------------------------- void FunctionSheet::hideEvent(QHideEvent *e) { - unregisterFrameScroller(); + m_frameScroller.unregisterFrameScroller(); SpreadsheetViewer::hideEvent(e); } diff --git a/toonz/sources/toonzqt/functiontoolbar.cpp b/toonz/sources/toonzqt/functiontoolbar.cpp index 304fb90..c66f7f6 100644 --- a/toonz/sources/toonzqt/functiontoolbar.cpp +++ b/toonz/sources/toonzqt/functiontoolbar.cpp @@ -63,8 +63,8 @@ FunctionToolbar::FunctionToolbar(QWidget *parent) space->setMinimumHeight(22); space->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - QIcon toggleIcon = createQIconOnOffPNG("swap", false); - QAction *toggleAction = new QAction(tr("&Function Editor Toggle"), this); + QIcon toggleIcon = createQIconOnOff("swap", false); + QAction *toggleAction = new QAction(tr("&Open Function Curve Editor"), this); assert(toggleAction); toggleAction->setIcon(toggleIcon); diff --git a/toonz/sources/toonzqt/fxschematicnode.cpp b/toonz/sources/toonzqt/fxschematicnode.cpp index d253ee8..ea47502 100644 --- a/toonz/sources/toonzqt/fxschematicnode.cpp +++ b/toonz/sources/toonzqt/fxschematicnode.cpp @@ -50,6 +50,7 @@ #include #include #include +#include //******************************************************************************** // Local namespace @@ -109,6 +110,12 @@ int getInputPortIndex(TFxPort *port, TFx *fx) { } return -1; } + +int getDevPixRatio() { + static int devPixRatio = QApplication::desktop()->devicePixelRatio(); + return devPixRatio; +} + } // namespace //***************************************************** @@ -337,8 +344,6 @@ void FxColumnPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) { QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx"); - QIcon addOutputFxIcon = createQIconOnOffPNG("output", false); - if (addOutputFx) addOutputFx->setIcon(addOutputFxIcon); QAction *addPaste = new QAction(tr("&Paste Add"), &menu); connect(addPaste, SIGNAL(triggered()), fxScene, SLOT(onAddPaste())); @@ -859,8 +864,6 @@ void FxPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) { QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx"); - QIcon addOutputFxIcon = createQIconOnOffPNG("output", false); - if (addOutputFx) addOutputFx->setIcon(addOutputFxIcon); QAction *deleteFx = new QAction(tr("&Delete"), &menu); connect(deleteFx, SIGNAL(triggered()), fxScene, SLOT(onDeleteFx())); @@ -1130,8 +1133,6 @@ void FxXSheetPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) { QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx"); - QIcon addOutputFxIcon = createQIconOnOffPNG("output", false); - if (addOutputFx) addOutputFx->setIcon(addOutputFxIcon); QAction *addPaste = new QAction(tr("&Paste Add"), &menu); connect(addPaste, SIGNAL(triggered()), fxScene, SLOT(onAddPaste())); @@ -1243,8 +1244,6 @@ void FxOutputPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) { } else { QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx"); - QIcon addOutputFxIcon = createQIconOnOffPNG("output", false); - addOutputFx->setIcon(addOutputFxIcon); menu.addAction(addOutputFx); } menu.exec(cme->screenPos()); @@ -1401,14 +1400,24 @@ void FxSchematicPort::paint(QPainter *painter, switch (getType()) { case eFxInputPort: case eFxGroupedInPort: { - QPixmap redPm = QPixmap(":Resources/fxport_red.png"); - painter->drawPixmap(boundingRect(), redPm, QRectF(0, 0, 50, 50)); + QRect sourceRect = + scene()->views()[0]->matrix().mapRect(boundingRect()).toRect(); + QPixmap redPm = + QIcon(":Resources/fxport_red.svg").pixmap(sourceRect.size()); + sourceRect = QRect(0, 0, sourceRect.width() * getDevPixRatio(), + sourceRect.height() * getDevPixRatio()); + painter->drawPixmap(boundingRect(), redPm, sourceRect); } break; case eFxOutputPort: case eFxGroupedOutPort: { - QPixmap bluePm = QPixmap(":Resources/fxport_blue.png"); - painter->drawPixmap(boundingRect(), bluePm, QRectF(0, 0, 50, 50)); + QRect sourceRect = + scene()->views()[0]->matrix().mapRect(boundingRect()).toRect(); + QPixmap bluePm = + QIcon(":Resources/fxport_blue.svg").pixmap(sourceRect.size()); + sourceRect = QRect(0, 0, sourceRect.width() * getDevPixRatio(), + sourceRect.height() * getDevPixRatio()); + painter->drawPixmap(boundingRect(), bluePm, sourceRect); FxSchematicDock *parentDock = dynamic_cast(parentItem()); if (parentDock) { @@ -1426,9 +1435,14 @@ void FxSchematicPort::paint(QPainter *painter, } break; case eFxLinkPort: // LinkPort - default: { - QPixmap linkPm = QPixmap(":Resources/schematic_link.png"); - painter->drawPixmap(boundingRect(), linkPm, QRectF(0, 0, 36, 14)); + default: { //ここから!!! + QRect sourceRect = + scene()->views()[0]->matrix().mapRect(boundingRect()).toRect(); + QPixmap linkPm = + QIcon(":Resources/schematic_link.svg").pixmap(sourceRect.size()); + sourceRect = QRect(0, 0, sourceRect.width() * getDevPixRatio(), + sourceRect.height() * getDevPixRatio()); + painter->drawPixmap(boundingRect(), linkPm, sourceRect); } break; } } diff --git a/toonz/sources/toonzqt/fxschematicscene.cpp b/toonz/sources/toonzqt/fxschematicscene.cpp index aa1ecf7..be0019b 100644 --- a/toonz/sources/toonzqt/fxschematicscene.cpp +++ b/toonz/sources/toonzqt/fxschematicscene.cpp @@ -900,11 +900,9 @@ void FxSchematicScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) { QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx"); - QAction *copy = CommandManager::instance()->getAction("MI_Copy"); - QAction *cut = CommandManager::instance()->getAction("MI_Cut"); - QAction *paste = CommandManager::instance()->getAction("MI_Paste"); - QIcon addOutputFxIcon = createQIconOnOffPNG("output", false); - if (addOutputFx) addOutputFx->setIcon(addOutputFxIcon); + QAction *copy = CommandManager::instance()->getAction("MI_Copy"); + QAction *cut = CommandManager::instance()->getAction("MI_Cut"); + QAction *paste = CommandManager::instance()->getAction("MI_Paste"); m_addFxContextMenu.setCurrentCursorScenePos(cme->scenePos()); diff --git a/toonz/sources/toonzqt/fxsettings.cpp b/toonz/sources/toonzqt/fxsettings.cpp index 5d31582..ecd478d 100644 --- a/toonz/sources/toonzqt/fxsettings.cpp +++ b/toonz/sources/toonzqt/fxsettings.cpp @@ -1203,7 +1203,9 @@ void FxSettings::createToolBar() { m_toolBar = new QToolBar(this); m_toolBar->setMovable(false); m_toolBar->setFixedHeight(23); - m_toolBar->setIconSize(QSize(23, 21)); + m_toolBar->setIconSize(QSize(17, 17)); + m_toolBar->setObjectName("MediumPaddingToolBar"); + // m_toolBar->setIconSize(QSize(23, 21)); // m_toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, // QSizePolicy::MinimumExpanding); @@ -1211,13 +1213,13 @@ void FxSettings::createToolBar() { QActionGroup *viewModeActGroup = new QActionGroup(m_toolBar); viewModeActGroup->setExclusive(false); // camera - QIcon camera = createQIconOnOffPNG("viewcamera"); + QIcon camera = createQIconOnOff("viewcamera"); QAction *cameraAct = new QAction(camera, tr("&Camera Preview"), m_toolBar); cameraAct->setCheckable(true); viewModeActGroup->addAction(cameraAct); m_toolBar->addAction(cameraAct); // preview - QIcon preview = createQIconOnOffPNG("preview"); + QIcon preview = createQIconOnOff("preview"); QAction *previewAct = new QAction(preview, tr("&Preview"), m_toolBar); previewAct->setCheckable(true); viewModeActGroup->addAction(previewAct); @@ -1230,7 +1232,7 @@ void FxSettings::createToolBar() { QActionGroup *viewModeGroup = new QActionGroup(m_toolBar); viewModeGroup->setExclusive(true); - QAction *whiteBg = new QAction(createQIconOnOffPNG("preview_white"), + QAction *whiteBg = new QAction(createQIconOnOff("preview_white"), tr("&White Background"), m_toolBar); whiteBg->setCheckable(true); whiteBg->setChecked(true); @@ -1238,14 +1240,14 @@ void FxSettings::createToolBar() { connect(whiteBg, SIGNAL(triggered()), this, SLOT(setWhiteBg())); m_toolBar->addAction(whiteBg); - QAction *blackBg = new QAction(createQIconOnOffPNG("preview_black"), + QAction *blackBg = new QAction(createQIconOnOff("preview_black"), tr("&Black Background"), m_toolBar); blackBg->setCheckable(true); viewModeGroup->addAction(blackBg); connect(blackBg, SIGNAL(triggered()), this, SLOT(setBlackBg())); m_toolBar->addAction(blackBg); - m_checkboardBg = new QAction(createQIconOnOffPNG("preview_checkboard"), + m_checkboardBg = new QAction(createQIconOnOff("preview_checkboard"), tr("&Checkered Background"), m_toolBar); m_checkboardBg->setCheckable(true); viewModeGroup->addAction(m_checkboardBg); diff --git a/toonz/sources/toonzqt/keyframenavigator.cpp b/toonz/sources/toonzqt/keyframenavigator.cpp index 278295a..8abb65a 100644 --- a/toonz/sources/toonzqt/keyframenavigator.cpp +++ b/toonz/sources/toonzqt/keyframenavigator.cpp @@ -38,7 +38,7 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, TFrameHandle *frameHandle) : QToolBar(parent), m_frameHandle(frameHandle) { setLayoutDirection(Qt::LeftToRight); - setIconSize(QSize(15, 23)); + setIconSize(QSize(18, 18)); setObjectName("keyFrameNavigator"); @@ -54,16 +54,16 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, TFrameHandle *frameHandle) m_actPreviewKey); // obtain a widget generated from QAction prevWidget->setObjectName("PreviousKey"); - m_actKeyNo = new QAction(createQIconPNG("key_no"), tr("Set Key"), this); + m_actKeyNo = new QAction(createQIcon("key_no"), tr("Set Key"), this); connect(m_actKeyNo, SIGNAL(triggered()), SLOT(toggleKeyAct())); addAction(m_actKeyNo); m_actKeyPartial = - new QAction(createQIconPNG("key_partial"), tr("Set Key"), this); + new QAction(createQIcon("key_partial"), tr("Set Key"), this); connect(m_actKeyPartial, SIGNAL(triggered()), SLOT(toggleKeyAct())); addAction(m_actKeyPartial); - m_actKeyTotal = new QAction(createQIconPNG("key_total"), tr("Set Key"), this); + m_actKeyTotal = new QAction(createQIcon("key_total"), tr("Set Key"), this); connect(m_actKeyTotal, SIGNAL(triggered()), SLOT(toggleKeyAct())); addAction(m_actKeyTotal); diff --git a/toonz/sources/toonzqt/paletteviewer.cpp b/toonz/sources/toonzqt/paletteviewer.cpp index 2444ccb..7e5f3ea 100644 --- a/toonz/sources/toonzqt/paletteviewer.cpp +++ b/toonz/sources/toonzqt/paletteviewer.cpp @@ -301,7 +301,7 @@ void PaletteViewer::createPaletteToolBar() { // Lock button to avoid editing the palette by mistake if (m_viewType == LEVEL_PALETTE) { - QIcon lockIcon = createQIconOnOffPNG("lockpalette"); + QIcon lockIcon = createQIconOnOff("lockpalette"); m_lockPaletteToolButton = new QToolButton(this); m_lockPaletteToolButton->setIcon(lockIcon); @@ -321,7 +321,7 @@ void PaletteViewer::createPaletteToolBar() { QToolButton *toolButton = new QToolButton(this); toolButton->setPopupMode(QToolButton::InstantPopup); - QIcon lockIcon = createQIconOnOffPNG("lockpalette"); + QIcon lockIcon = createQIconOnOff("lockpalette"); toolButton->setIcon(lockIcon); toolButton->setObjectName("PaletteLockButton"); @@ -349,7 +349,7 @@ void PaletteViewer::createPaletteToolBar() { QToolButton *viewModeButton = new QToolButton(this); viewModeButton->setPopupMode(QToolButton::InstantPopup); - QIcon viewModeIcon = createQIconPNG("options"); + QIcon viewModeIcon = createQIcon("options"); viewModeButton->setIcon(viewModeIcon); QMenu *viewMode = new QMenu(QString("Options"), viewModeButton); viewMode->setToolTip(tr("Options")); @@ -410,14 +410,14 @@ void PaletteViewer::createPaletteToolBar() { if (m_hasPageCommand) { QAction *addPage; - QIcon addPageIcon = createQIconPNG("newpage"); + QIcon addPageIcon = createQIcon("newpage"); addPage = new QAction(addPageIcon, tr("&New Page"), m_paletteToolBar); connect(addPage, SIGNAL(triggered()), this, SLOT(addNewPage())); m_paletteToolBar->addAction(addPage); } - QIcon newColorIcon = createQIconPNG("newstyle"); + QIcon newColorIcon = createQIcon("newstyle"); QAction *addColor = new QAction(newColorIcon, tr("&New Style"), m_paletteToolBar); connect(addColor, SIGNAL(triggered()), this, SLOT(addNewColor())); @@ -450,11 +450,11 @@ void PaletteViewer::createSavePaletteToolBar() { } // save palette as - QIcon saveAsPaletteIcon = createQIconOnOffPNG("savepaletteas", false); + QIcon saveAsPaletteIcon = createQIconOnOff("savepaletteas", false); QAction *saveAsPalette = new QAction( saveAsPaletteIcon, tr("&Save Palette As"), m_savePaletteToolBar); // overwrite palette - QIcon savePaletteIcon = createQIconOnOffPNG("savepalette", false); + QIcon savePaletteIcon = createQIconOnOff("savepalette", false); QAction *savePalette = new QAction(savePaletteIcon, tr("&Save Palette"), m_savePaletteToolBar); diff --git a/toonz/sources/toonzqt/popupbutton.cpp b/toonz/sources/toonzqt/popupbutton.cpp index 8bdecee..664285c 100644 --- a/toonz/sources/toonzqt/popupbutton.cpp +++ b/toonz/sources/toonzqt/popupbutton.cpp @@ -14,7 +14,7 @@ PopupButton::PopupButton(QWidget *parent) : QPushButton(parent), m_index(-1) { QMenu *menu = new QMenu(this); setMenu(menu); - + menu->setToolTipsVisible(true); connect(this, SIGNAL(clicked(bool)), this, SLOT(showMenu())); } diff --git a/toonz/sources/toonzqt/schematicviewer.cpp b/toonz/sources/toonzqt/schematicviewer.cpp index 4338903..36c030b 100644 --- a/toonz/sources/toonzqt/schematicviewer.cpp +++ b/toonz/sources/toonzqt/schematicviewer.cpp @@ -450,10 +450,10 @@ SchematicViewer::SchematicViewer(QWidget *parent) m_fxToolbar = new QToolBar(m_viewer); m_swapToolbar = new QToolBar(m_viewer); - m_commonToolbar->setObjectName("ToolBarWithoutBorder"); - m_stageToolbar->setObjectName("ToolBarWithoutBorder"); - m_fxToolbar->setObjectName("ToolBarWithoutBorder"); - m_swapToolbar->setObjectName("ToolBarWithoutBorder"); + m_commonToolbar->setObjectName("MediumPaddingToolBar"); + m_stageToolbar->setObjectName("MediumPaddingToolBar"); + m_fxToolbar->setObjectName("MediumPaddingToolBar"); + m_swapToolbar->setObjectName("MediumPaddingToolBar"); createToolbars(); createActions(); @@ -540,22 +540,22 @@ void SchematicViewer::setSchematicScene(SchematicScene *scene) { void SchematicViewer::createToolbars() { // Initialize them m_stageToolbar->setMovable(false); - m_stageToolbar->setIconSize(QSize(23, 17)); + m_stageToolbar->setIconSize(QSize(17, 17)); m_stageToolbar->setLayoutDirection(Qt::RightToLeft); m_stageToolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_commonToolbar->setMovable(false); - m_commonToolbar->setIconSize(QSize(23, 17)); + m_commonToolbar->setIconSize(QSize(17, 17)); m_commonToolbar->setLayoutDirection(Qt::RightToLeft); m_commonToolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_fxToolbar->setMovable(false); - m_fxToolbar->setIconSize(QSize(23, 17)); + m_fxToolbar->setIconSize(QSize(17, 17)); m_fxToolbar->setLayoutDirection(Qt::RightToLeft); m_fxToolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_swapToolbar->setMovable(false); - m_swapToolbar->setIconSize(QSize(23, 17)); + m_swapToolbar->setIconSize(QSize(17, 17)); m_swapToolbar->setLayoutDirection(Qt::RightToLeft); m_swapToolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); } @@ -568,29 +568,29 @@ void SchematicViewer::createActions() { *addOutputFx = 0, *switchPort = 0; { // Fit schematic - QIcon fitSchematicIcon = createQIconOnOffPNG("fit", false); + QIcon fitSchematicIcon = createQIconOnOff("fit", false); m_fitSchematic = new QAction(fitSchematicIcon, tr("&Fit to Window"), m_commonToolbar); connect(m_fitSchematic, SIGNAL(triggered()), m_viewer, SLOT(fitScene())); // Center On - QIcon centerOnIcon = createQIconOnOffPNG("centerselection", false); + QIcon centerOnIcon = createQIconOnOff("centerselection", false); m_centerOn = new QAction(centerOnIcon, tr("&Focus on Current"), m_commonToolbar); connect(m_centerOn, SIGNAL(triggered()), m_viewer, SLOT(centerOnCurrent())); // Reorder schematic - QIcon reorderIcon = createQIconOnOffPNG("reorder", false); + QIcon reorderIcon = createQIconOnOff("reorder", false); m_reorder = new QAction(reorderIcon, tr("&Reorder Nodes"), m_commonToolbar); connect(m_reorder, SIGNAL(triggered()), m_viewer, SLOT(reorderScene())); // Normalize schematic schematic - QIcon normalizeIcon = createQIconOnOffPNG("resetsize", false); + QIcon normalizeIcon = createQIconOnOff("resetsize", false); m_normalize = new QAction(normalizeIcon, tr("&Reset Size"), m_commonToolbar); connect(m_normalize, SIGNAL(triggered()), m_viewer, SLOT(normalizeScene())); - QIcon nodeSizeIcon = createQIconOnOffPNG( + QIcon nodeSizeIcon = createQIconOnOff( m_maximizedNode ? "minimizenodes" : "maximizenodes", false); m_nodeSize = new QAction(nodeSizeIcon, m_maximizedNode ? tr("&Minimize Nodes") @@ -601,21 +601,21 @@ void SchematicViewer::createActions() { if (m_fullSchematic) { // AddPegbar addPegbar = new QAction(tr("&New Pegbar"), m_stageToolbar); - QIcon addPegbarIcon = createQIconOnOffPNG("pegbar", false); + QIcon addPegbarIcon = createQIconOnOff("pegbar", false); addPegbar->setIcon(addPegbarIcon); connect(addPegbar, SIGNAL(triggered()), m_stageScene, SLOT(onPegbarAdded())); // AddCamera addCamera = new QAction(tr("&New Camera"), m_stageToolbar); - QIcon addCameraIcon = createQIconOnOffPNG("camera", false); + QIcon addCameraIcon = createQIconOnOff("camera", false); addCamera->setIcon(addCameraIcon); connect(addCamera, SIGNAL(triggered()), m_stageScene, SLOT(onCameraAdded())); // AddSpline addSpline = new QAction(tr("&New Motion Path"), m_stageToolbar); - QIcon addSplineIcon = createQIconOnOffPNG("motionpath", false); + QIcon addSplineIcon = createQIconOnOff("motionpath", false); addSpline->setIcon(addSplineIcon); connect(addSpline, SIGNAL(triggered()), m_stageScene, SLOT(onSplineAdded())); @@ -625,7 +625,7 @@ void SchematicViewer::createActions() { new QAction(tr("&Swtich output port display mode"), m_stageToolbar); switchPort->setCheckable(true); switchPort->setChecked(m_stageScene->isShowLetterOnPortFlagEnabled()); - QIcon switchPortIcon = createQIconOnOffPNG("switchport"); + QIcon switchPortIcon = createQIconOnOff("switchport"); switchPort->setIcon(switchPortIcon); connect(switchPort, SIGNAL(toggled(bool)), m_stageScene, SLOT(onSwitchPortModeToggled(bool))); @@ -633,17 +633,15 @@ void SchematicViewer::createActions() { // InsertFx insertFx = CommandManager::instance()->getAction("MI_InsertFx"); if (insertFx) { - QIcon insertFxIcon = createQIconOnOffPNG("fx", false); + QIcon insertFxIcon = createQIconOnOff("fx", false); insertFx->setIcon(insertFxIcon); } // AddOutputFx addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx"); - QIcon addOutputFxIcon = createQIconOnOffPNG("output", false); - if (addOutputFx) addOutputFx->setIcon(addOutputFxIcon); // Swap fx/stage schematic - QIcon changeSchematicIcon = createQIconOnOffPNG("swap", false); + QIcon changeSchematicIcon = createQIconOnOff("swap", false); m_changeScene = CommandManager::instance()->getAction("A_FxSchematicToggle", true); if (m_changeScene) { @@ -740,7 +738,7 @@ void SchematicViewer::onSceneSwitched() { ->getXsheet() ->getFxDag() ->getDagGridDimension() == 0; - QIcon nodeSizeIcon = createQIconOnOffPNG( + QIcon nodeSizeIcon = createQIconOnOff( m_maximizedNode ? "minimizenodes" : "maximizenodes", false); m_nodeSize->setIcon(nodeSizeIcon); QString label(m_maximizedNode ? tr("&Minimize Nodes") @@ -799,7 +797,7 @@ void SchematicViewer::changeNodeSize() { // aggiono l'icona del pulsante; m_fxScene->resizeNodes(m_maximizedNode); m_stageScene->resizeNodes(m_maximizedNode); - QIcon nodeSizeIcon = createQIconOnOffPNG( + QIcon nodeSizeIcon = createQIconOnOff( m_maximizedNode ? "minimizenodes" : "maximizenodes", false); m_nodeSize->setIcon(nodeSizeIcon); QString label(m_maximizedNode ? tr("&Minimize Nodes") diff --git a/toonz/sources/toonzqt/spreadsheetviewer.cpp b/toonz/sources/toonzqt/spreadsheetviewer.cpp index 3858bf2..1274772 100644 --- a/toonz/sources/toonzqt/spreadsheetviewer.cpp +++ b/toonz/sources/toonzqt/spreadsheetviewer.cpp @@ -4,6 +4,7 @@ #include "toonzqt/gutil.h" #include "toonz/tframehandle.h" +#include "orientation.h" #include #include @@ -21,60 +22,106 @@ namespace Spreadsheet { //============================================================================= -FrameScroller::FrameScroller() {} +FrameScroller::FrameScroller() + : m_orientation(Orientations::topToBottom()) + , m_scrollArea(nullptr) + , m_lastX(0) + , m_lastY(0) + , m_syncing(false) {} FrameScroller::~FrameScroller() {} -void FrameScroller::connectScroller(FrameScroller *scroller) { - if (scroller != this && !m_connectedScrollers.contains(scroller)) { - m_connectedScrollers.append(scroller); - scroller->connectScroller(this); - QScrollBar *sb0 = getFrameScrollArea()->verticalScrollBar(); - QScrollBar *sb1 = scroller->getFrameScrollArea()->verticalScrollBar(); - QObject::connect(sb0, SIGNAL(valueChanged(int)), sb1, SLOT(setValue(int))); - QObject::connect(sb1, SIGNAL(valueChanged(int)), sb0, SLOT(setValue(int))); - } +void FrameScroller::setFrameScrollArea(QScrollArea *scrollArea) { + disconnectScrollbars(); + m_scrollArea = scrollArea; + connectScrollbars(); } -void FrameScroller::disconnectScroller(FrameScroller *scroller) { - if (m_connectedScrollers.contains(scroller)) { - m_connectedScrollers.removeAll(scroller); - scroller->disconnectScroller(this); - QScrollBar *sb0 = getFrameScrollArea()->verticalScrollBar(); - QScrollBar *sb1 = scroller->getFrameScrollArea()->verticalScrollBar(); - QObject::disconnect(sb0, SIGNAL(valueChanged(int)), sb1, - SLOT(setValue(int))); - QObject::disconnect(sb1, SIGNAL(valueChanged(int)), sb0, - SLOT(setValue(int))); - } +void FrameScroller::disconnectScrollbars() { + if (!m_scrollArea) return; + disconnect(m_scrollArea->verticalScrollBar(), &QScrollBar::valueChanged, this, + &FrameScroller::onVScroll); + disconnect(m_scrollArea->horizontalScrollBar(), &QScrollBar::valueChanged, + this, &FrameScroller::onHScroll); } -bool FrameScroller::isScrollerConnected(FrameScroller *scroller) { - return m_connectedScrollers.contains(scroller); +void FrameScroller::connectScrollbars() { + if (!m_scrollArea) return; + m_lastX = m_scrollArea->horizontalScrollBar()->value(); + m_lastY = m_scrollArea->verticalScrollBar()->value(); + connect(m_scrollArea->verticalScrollBar(), &QScrollBar::valueChanged, this, + &FrameScroller::onVScroll); + connect(m_scrollArea->horizontalScrollBar(), &QScrollBar::valueChanged, this, + &FrameScroller::onHScroll); +} + +void FrameScroller::onVScroll(int y) { + QPoint offset(0, y - m_lastY); + if (isSyncing()) return; + m_lastY = y; + setSyncing(true); + handleScroll(offset); + setSyncing(false); +} +void FrameScroller::onHScroll(int x) { + QPoint offset(x - m_lastX, 0); + if (isSyncing()) return; + m_lastX = x; + setSyncing(true); + handleScroll(offset); + setSyncing(false); } static QList frameScrollers; +void FrameScroller::handleScroll(const QPoint &offset) const { + CellPositionRatio ratio = orientation()->xyToPositionRatio(offset); + if ((m_orientation->isVerticalTimeline() && offset.x()) || + (!m_orientation->isVerticalTimeline() && + offset.y())) // only synchronize changes by frames axis + return; + + for (int i = 0; i < frameScrollers.size(); i++) + if (frameScrollers[i] != this) { + if (!frameScrollers[i]->isSyncing()) { + frameScrollers[i]->onScroll(ratio); + break; + } + } +} + +void adjustScrollbar(QScrollBar *scrollBar, int add); + +void FrameScroller::onScroll(const CellPositionRatio &ratio) { + QPoint offset = orientation()->positionRatioToXY(ratio); + if (offset.x()) + adjustScrollbar(m_scrollArea->horizontalScrollBar(), offset.x()); + if (offset.y()) + adjustScrollbar(m_scrollArea->verticalScrollBar(), offset.y()); + + emit prepareToScrollOffset(offset); +} +void adjustScrollbar(QScrollBar *scrollBar, int add) { + scrollBar->setValue(scrollBar->value() + add); +} + void FrameScroller::registerFrameScroller() { - if (!frameScrollers.contains(this)) { - for (int i = 0; i < frameScrollers.size(); i++) - connectScroller(frameScrollers[i]); - frameScrollers.append(this); - } + if (!frameScrollers.contains(this)) frameScrollers.append(this); } void FrameScroller::unregisterFrameScroller() { - if (frameScrollers.contains(this)) { - frameScrollers.removeAll(this); - for (int i = 0; i < frameScrollers.size(); i++) - disconnectScroller(frameScrollers[i]); - } + if (frameScrollers.contains(this)) frameScrollers.removeAll(this); } -void FrameScroller::prepareToScroll(int dy) { - if (dy == 0) return; +void FrameScroller::prepareToScrollOthers(const QPoint &offset) { + CellPositionRatio ratio = orientation()->xyToPositionRatio(offset); for (int i = 0; i < frameScrollers.size(); i++) - if (frameScrollers[i] != this) frameScrollers[i]->onPrepareToScroll(dy); + if (frameScrollers[i] != this) + frameScrollers[i]->prepareToScrollRatio(ratio); +} +void FrameScroller::prepareToScrollRatio(const CellPositionRatio &ratio) { + QPoint offset = orientation()->positionRatioToXY(ratio); + emit prepareToScrollOffset(offset); } //============================================================================= @@ -188,14 +235,16 @@ void GenericPanel::mousePressEvent(QMouseEvent *e) { else m_dragTool = createDragTool(e); - int row = getViewer()->yToRow(e->pos().y()); - int col = getViewer()->xToColumn(e->pos().x()); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); if (m_dragTool) m_dragTool->click(row, col, e); } void GenericPanel::mouseReleaseEvent(QMouseEvent *e) { - int row = getViewer()->yToRow(e->pos().y()); - int col = getViewer()->xToColumn(e->pos().x()); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); m_viewer->stopAutoPan(); if (m_dragTool) { m_dragTool->release(row, col, e); @@ -205,8 +254,9 @@ void GenericPanel::mouseReleaseEvent(QMouseEvent *e) { } void GenericPanel::mouseMoveEvent(QMouseEvent *e) { - int row = getViewer()->yToRow(e->pos().y()); - int col = getViewer()->xToColumn(e->pos().x()); + CellPosition cellPosition = getViewer()->xyToPosition(e->pos()); + int row = cellPosition.frame(); + int col = cellPosition.layer(); if (e->buttons() != 0 && m_dragTool != 0) { if ((e->buttons() & Qt::LeftButton) != 0 && !visibleRegion().contains(e->pos())) { @@ -289,9 +339,10 @@ void RowPanel::paintEvent(QPaintEvent *e) { QRect toBeUpdated = e->rect(); QPainter p(this); - // range di righe visibili - int r0 = getViewer()->yToRow(toBeUpdated.top()); - int r1 = getViewer()->yToRow(toBeUpdated.bottom()); + CellRange visible = getViewer()->xyRectToRange(toBeUpdated); + // range of visible rows + int r0 = visible.from().frame(); + int r1 = visible.to().frame(); p.setClipRect(toBeUpdated); p.fillRect(toBeUpdated, QBrush(getViewer()->getLightLightBGColor())); @@ -324,13 +375,15 @@ void CellPanel::paintEvent(QPaintEvent *e) { int y0 = toBeUpdated.top(); int x1 = toBeUpdated.right(), y1 = toBeUpdated.bottom(); + QRect alteredRect(QPoint(x0, y0), QPoint(x1, y1)); + CellRange cellRange = getViewer()->xyRectToRange(alteredRect); // visible rows range - int r0 = getViewer()->yToRow(y0); - int r1 = getViewer()->yToRow(y1); + int r0 = cellRange.from().frame(); + int r1 = cellRange.to().frame(); // visible columns range - int c0 = getViewer()->xToColumn(x0); - int c1 = getViewer()->xToColumn(x1); + int c0 = cellRange.from().layer(); + int c1 = cellRange.to().layer(); // cambia colore alle celle prima di rowCount() int rowCount = getViewer()->getRowCount(); @@ -389,7 +442,10 @@ SpreadsheetViewer::SpreadsheetViewer(QWidget *parent) , m_currentRow(0) , m_markRowDistance(6) , m_markRowOffset(0) - , m_isComputingSize(false) { + , m_isComputingSize(false) + , m_frameScroller() { + // m_orientation = Orientations::topToBottom (); + setFocusPolicy(Qt::NoFocus); setFrameStyle(QFrame::StyledPanel); @@ -427,6 +483,10 @@ SpreadsheetViewer::SpreadsheetViewer(QWidget *parent) m_columnScrollArea->setFixedHeight(m_rowHeight * 3 - 3); // m_columnScrollArea->setFixedHeight(m_rowHeight * 3 + 60 - 63); + m_frameScroller.setFrameScrollArea(m_cellScrollArea); + connect(&m_frameScroller, &Spreadsheet::FrameScroller::prepareToScrollOffset, + this, &SpreadsheetViewer::onPrepareToScrollOffset); + //---- layout QGridLayout *layout = new QGridLayout(); layout->setMargin(0); @@ -520,7 +580,6 @@ void SpreadsheetViewer::setColumnCount(int columnCount) { void SpreadsheetViewer::scroll(QPoint delta) { int x = delta.x(); int y = delta.y(); - prepareToScroll(y); QScrollBar *hSc = m_cellScrollArea->horizontalScrollBar(); QScrollBar *vSc = m_cellScrollArea->verticalScrollBar(); @@ -547,6 +606,10 @@ void SpreadsheetViewer::scroll(QPoint delta) { vSc->setValue(valueV); } +void SpreadsheetViewer::onPrepareToScrollOffset(const QPoint &offset) { + refreshContentSize(offset.x(), offset.y()); +} + void SpreadsheetViewer::setAutoPanSpeed(const QPoint &speed) { bool wasAutoPanning = isAutoPanning(); m_autoPanSpeed = speed; @@ -583,21 +646,42 @@ void SpreadsheetViewer::setAutoPanSpeed(const QRect &widgetBounds, m_lastAutoPanPos = mousePos; } -/*!Shift is a consequence of style sheet border.*/ int SpreadsheetViewer::xToColumn(int x) const { - return (x + 1) / m_columnWidth; + CellPosition pos = xyToPosition(QPoint(x, 0)); + return pos.layer(); +} +int SpreadsheetViewer::yToRow(int y) const { + CellPosition pos = xyToPosition(QPoint(0, y)); + return pos.frame(); } - -/*!Shift is a consequence of style sheet border.*/ int SpreadsheetViewer::columnToX(int col) const { - return (col * m_columnWidth) - 1; + QPoint xy = positionToXY(CellPosition(0, col)); + return xy.x(); +} +int SpreadsheetViewer::rowToY(int row) const { + QPoint xy = positionToXY(CellPosition(row, 0)); + return xy.y(); } /*!Shift is a consequence of style sheet border.*/ -int SpreadsheetViewer::yToRow(int y) const { return (y + 1) / m_rowHeight; } +CellPosition SpreadsheetViewer::xyToPosition(const QPoint &point) const { + int row = (point.y() + 1) / m_rowHeight; + int col = (point.x() + 1) / m_columnWidth; + return CellPosition(row, col); +} /*!Shift is a consequence of style sheet border.*/ -int SpreadsheetViewer::rowToY(int row) const { return (row * m_rowHeight) - 1; } +QPoint SpreadsheetViewer::positionToXY(const CellPosition &pos) const { + int x = (pos.layer() * m_columnWidth) - 1; + int y = (pos.frame() * m_rowHeight) - 1; + return QPoint(x, y); +} + +CellRange SpreadsheetViewer::xyRectToRange(const QRect &rect) const { + CellPosition topLeft = xyToPosition(rect.topLeft()); + CellPosition bottomRight = xyToPosition(rect.bottomRight()); + return CellRange(topLeft, bottomRight); +} bool SpreadsheetViewer::refreshContentSize(int scrollDx, int scrollDy) { QSize viewportSize = m_cellScrollArea->viewport()->size(); diff --git a/toonz/sources/toonzqt/styleeditor.cpp b/toonz/sources/toonzqt/styleeditor.cpp index 2c08501..cebf9bd 100644 --- a/toonz/sources/toonzqt/styleeditor.cpp +++ b/toonz/sources/toonzqt/styleeditor.cpp @@ -17,6 +17,7 @@ #include "toonz/imagestyles.h" #include "toonz/txshsimplelevel.h" //iwsw #include "toonz/levelproperties.h" //iwsw +#include "toonz/mypaintbrushstyle.h" // TnzCore includes #include "tconvert.h" @@ -2181,6 +2182,102 @@ bool TextureStyleChooserPage::event(QEvent *e) { } //***************************************************************************** +// MyPaintBrushStyleChooserPage definition +//***************************************************************************** + +class MyPaintBrushStyleChooserPage final : public StyleChooserPage { +public: + struct Brush { + TRasterP m_raster; + QString m_name; + }; + +private: + static std::vector m_brushes; + +public: + MyPaintBrushStyleChooserPage(QWidget *parent = 0) : StyleChooserPage(parent) + { m_chipSize = QSize(64, 64); } + + bool loadIfNeeded() override { + static bool m_loaded = false; + if (!m_loaded) { + loadItems(); + m_loaded = true; + return true; + } else + return false; + } + + int getChipCount() const override + { return m_brushes.size() + 1; } + + static void loadItems(); + + void drawChip(QPainter &p, QRect rect, int index) override { + assert(0 <= index && index <= (int)m_brushes.size()); + static QImage noStyleImage(":Resources/no_mypaintbrush.png"); + p.drawImage(rect, index == 0 ? noStyleImage : rasterToQImage(m_brushes[index-1].getPreview())); + } + + void onSelect(int index) override { + assert(0 <= index && index <= (int)m_brushes.size()); + static TSolidColorStyle noStyle(TPixel32::Black); + if (index == 0) { + emit styleSelected(noStyle); + } else { + emit styleSelected(m_brushes[index-1]); + } + } + + bool event(QEvent *e) override { + static TSolidColorStyle noStyle(TPixel32::Black); + if (e->type() == QEvent::ToolTip) { + QHelpEvent *helpEvent = dynamic_cast(e); + QString toolTip; + QPoint pos = helpEvent->pos(); + int index = posToIndex(pos); + if (index == 0) { + toolTip = tr("Plain color"); + } else + if (index > 0 && index <= (int)m_brushes.size()) { + toolTip = m_brushes[index-1].getPath().getQString(); + } + QToolTip::showText(helpEvent->globalPos(), toolTip); + e->accept(); + } + return StyleChooserPage::event(e); + } +}; + +//----------------------------------------------------------------------------- + +std::vector MyPaintBrushStyleChooserPage::m_brushes; + +//----------------------------------------------------------------------------- + +void MyPaintBrushStyleChooserPage::loadItems() { + m_brushes.clear(); + std::set brushFiles; + + TFilePathSet dirs = TMyPaintBrushStyle::getBrushesDirs(); + for(TFilePathSet::iterator i = dirs.begin(); i != dirs.end(); ++i) { + TFileStatus fs(*i); + if (fs.doesExist() && fs.isDirectory()) { + TFilePathSet files = TSystem::readDirectoryTree(*i, false, true); + for(TFilePathSet::iterator j = files.begin(); j != files.end(); ++j) + if (j->getType() == TMyPaintBrushStyle::getBrushType()) + brushFiles.insert(*j - *i); + } + } + + // reserve memory to avoid reallocation + m_brushes.reserve(brushFiles.size()); + for(std::set::iterator i = brushFiles.begin(); i != brushFiles.end(); ++i) + m_brushes.push_back(TMyPaintBrushStyle(*i)); +} + +//***************************************************************************** // SpecialStyleChooser definition //***************************************************************************** @@ -2232,7 +2329,8 @@ void SpecialStyleChooserPage::loadItems() { tagId == 2800 || // imagepattern tagId == 2001 || // cleanup tagId == 2002 || // ?? - tagId == 3000 // vector brush + tagId == 3000 || // vector brush + tagId == 4001 // mypaint brush ) continue; @@ -2589,6 +2687,17 @@ void SettingsPage::setStyle(const TColorStyleP &editedStyle) { } } + // "reset to default" button + if (m_editedStyle->hasParamDefault(p)) { + QPushButton *pushButton = new QPushButton; + pushButton->setToolTip(tr("Reset to default")); + pushButton->setIcon(createQIconPNG("delete")); + m_paramsLayout->addWidget(pushButton, p, 2); + ret = QObject::connect(pushButton, SIGNAL(clicked(bool)), this, + SLOT(onValueReset())) && + ret; + } + assert(ret); } } @@ -2613,6 +2722,13 @@ void SettingsPage::updateValues() { int p, pCount = m_editedStyle->getParamCount(); for (p = 0; p != pCount; ++p) { + // Update state of "reset to default" button + if (m_editedStyle->hasParamDefault(p)) { + QPushButton *pushButton = static_cast( + m_paramsLayout->itemAtPosition(p, 2)->widget()); + pushButton->setEnabled(m_editedStyle->isParamDefault(p)); + } + // Update editor values switch (m_editedStyle->getParamType(p)) { case TColorStyle::BOOL: { @@ -2680,26 +2796,40 @@ void SettingsPage::onAutofillChanged() { //----------------------------------------------------------------------------- -void SettingsPage::onValueChanged(bool isDragging) { - struct Locals { - SettingsPage *m_this; +int SettingsPage::getParamIndex(const QWidget *widget) { + int p, pCount = m_paramsLayout->rowCount(); + for (p = 0; p != pCount; ++p) + for(int c = 0; c < 3; ++c) + if (QLayoutItem *item = m_paramsLayout->itemAtPosition(p, c)) + if (item->widget() == widget) + return p; + return -1; +} - int paramIndex(const QWidget *widget) { - int p, pCount = m_this->m_paramsLayout->rowCount(); - for (p = 0; p != pCount; ++p) - if (m_this->m_paramsLayout->itemAtPosition(p, 1)->widget() == widget) - break; +//----------------------------------------------------------------------------- - return p; - } +void SettingsPage::onValueReset() { + assert(m_editedStyle); - } locals = {this}; + // Extract the parameter index + QWidget *senderWidget = static_cast(sender()); + int p = getParamIndex(senderWidget); + assert(0 <= p && p < m_editedStyle->getParamCount()); + m_editedStyle->setParamDefault(p); + + // Forward the signal to the style editor + if (!m_updating) emit paramStyleChanged(false); +} + +//----------------------------------------------------------------------------- + +void SettingsPage::onValueChanged(bool isDragging) { assert(m_editedStyle); // Extract the parameter index QWidget *senderWidget = static_cast(sender()); - int p = locals.paramIndex(senderWidget); + int p = getParamIndex(senderWidget); assert(0 <= p && p < m_editedStyle->getParamCount()); @@ -2790,12 +2920,13 @@ StyleEditor::StyleEditor(PaletteController *paletteController, QWidget *parent) m_tabBarContainer = new TabBarContainter(this); m_colorParameterSelector = new ColorParameterSelector(this); - m_plainColorPage = new PlainColorPage(0); - m_textureStylePage = new TextureStyleChooserPage(0); - m_specialStylePage = new SpecialStyleChooserPage(0); - m_customStylePage = new CustomStyleChooserPage(0); - m_vectorBrushesStylePage = new VectorBrushStyleChooserPage(0); - m_settingsPage = new SettingsPage(0); + m_plainColorPage = new PlainColorPage(0); + m_textureStylePage = new TextureStyleChooserPage(0); + m_specialStylePage = new SpecialStyleChooserPage(0); + m_customStylePage = new CustomStyleChooserPage(0); + m_vectorBrushesStylePage = new VectorBrushStyleChooserPage(0); + m_mypaintBrushesStylePage = new MyPaintBrushStyleChooserPage(0); + m_settingsPage = new SettingsPage(0); QWidget *emptyPage = new StyleEditorPage(0); @@ -2806,10 +2937,11 @@ StyleEditor::StyleEditor(PaletteController *paletteController, QWidget *parent) // in order to use the styleSheet to stylish its background QScrollArea *plainArea = makeChooserPageWithoutScrollBar(m_plainColorPage); - QScrollArea *textureArea = makeChooserPage(m_textureStylePage); - QScrollArea *specialArea = makeChooserPage(m_specialStylePage); - QScrollArea *customArea = makeChooserPage(m_customStylePage); - QScrollArea *vectorBrushesArea = makeChooserPage(m_vectorBrushesStylePage); + QScrollArea *textureArea = makeChooserPage(m_textureStylePage); + QScrollArea *specialArea = makeChooserPage(m_specialStylePage); + QScrollArea *customArea = makeChooserPage(m_customStylePage); + QScrollArea *vectorBrushesArea = makeChooserPage(m_vectorBrushesStylePage); + QScrollArea *mypaintBrushesArea = makeChooserPage(m_mypaintBrushesStylePage); QScrollArea *settingsArea = makeChooserPageWithoutScrollBar(m_settingsPage); m_styleChooser = new QStackedWidget(this); @@ -2818,6 +2950,7 @@ StyleEditor::StyleEditor(PaletteController *paletteController, QWidget *parent) m_styleChooser->addWidget(specialArea); m_styleChooser->addWidget(customArea); m_styleChooser->addWidget(vectorBrushesArea); + m_styleChooser->addWidget(mypaintBrushesArea); m_styleChooser->addWidget(settingsArea); m_styleChooser->addWidget(makeChooserPageWithoutScrollBar(emptyPage)); m_styleChooser->setFocusPolicy(Qt::NoFocus); @@ -2857,33 +2990,48 @@ StyleEditor::StyleEditor(PaletteController *paletteController, QWidget *parent) /* ------- signal-slot connections ------- */ bool ret = true; - ret = ret && connect(m_styleBar, SIGNAL(currentChanged(int)), this, - SLOT(setPage(int))); - ret = ret && connect(m_colorParameterSelector, SIGNAL(colorParamChanged()), - this, SLOT(onColorParamChanged())); - ret = ret && - connect(m_textureStylePage, SIGNAL(styleSelected(const TColorStyle &)), - this, SLOT(selectStyle(const TColorStyle &))); - ret = ret && - connect(m_specialStylePage, SIGNAL(styleSelected(const TColorStyle &)), - this, SLOT(selectStyle(const TColorStyle &))); - ret = ret && - connect(m_customStylePage, SIGNAL(styleSelected(const TColorStyle &)), - this, SLOT(selectStyle(const TColorStyle &))); - ret = ret && connect(m_vectorBrushesStylePage, - SIGNAL(styleSelected(const TColorStyle &)), this, - SLOT(selectStyle(const TColorStyle &))); - ret = ret && connect(m_settingsPage, SIGNAL(paramStyleChanged(bool)), this, - SLOT(onParamStyleChanged(bool))); - ret = ret && connect(m_plainColorPage, - SIGNAL(colorChanged(const ColorModel &, bool)), this, - SLOT(onColorChanged(const ColorModel &, bool))); + ret = ret && connect( m_styleBar, + SIGNAL(currentChanged(int)), + this, + SLOT(setPage(int)) ); + ret = ret && connect( m_colorParameterSelector, + SIGNAL(colorParamChanged()), + this, + SLOT(onColorParamChanged()) ); + ret = ret && connect( m_textureStylePage, + SIGNAL(styleSelected(const TColorStyle &)), + this, + SLOT(selectStyle(const TColorStyle &))); + ret = ret && connect( m_specialStylePage, + SIGNAL(styleSelected(const TColorStyle &)), + this, + SLOT(selectStyle(const TColorStyle &)) ); + ret = ret && connect( m_customStylePage, + SIGNAL(styleSelected(const TColorStyle &)), + this, + SLOT(selectStyle(const TColorStyle &)) ); + ret = ret && connect( m_vectorBrushesStylePage, + SIGNAL(styleSelected(const TColorStyle &)), + this, + SLOT(selectStyle(const TColorStyle &)) ); + ret = ret && connect( m_mypaintBrushesStylePage, + SIGNAL(styleSelected(const TColorStyle &)), + this, + SLOT(selectStyle(const TColorStyle &)) ); + ret = ret && connect( m_settingsPage, + SIGNAL(paramStyleChanged(bool)), + this, + SLOT(onParamStyleChanged(bool)) ); + ret = ret && connect( m_plainColorPage, + SIGNAL(colorChanged(const ColorModel &, bool)), + this, + SLOT(onColorChanged(const ColorModel &, bool)) ); assert(ret); /* ------- initial conditions ------- */ enable(false, false, false); // set to the empty page - m_styleChooser->setCurrentIndex(6); + m_styleChooser->setCurrentIndex(7); } //----------------------------------------------------------------------------- @@ -2973,6 +3121,7 @@ void StyleEditor::updateTabBar() { m_styleBar->addSimpleTab(tr("Special")); m_styleBar->addSimpleTab(tr("Custom")); m_styleBar->addSimpleTab(tr("Vector Brush")); + m_styleBar->addSimpleTab(tr("MyPaint Brush")); m_styleBar->addSimpleTab(tr("Settings")); } else if (m_enabled && m_enabledOnlyFirstTab && !m_enabledFirstAndLastTab) m_styleBar->addSimpleTab(tr("Plain")); @@ -2980,7 +3129,7 @@ void StyleEditor::updateTabBar() { m_styleBar->addSimpleTab(tr("Plain")); m_styleBar->addSimpleTab(tr("Settings")); } else { - m_styleChooser->setCurrentIndex(6); + m_styleChooser->setCurrentIndex(7); return; } m_tabBarContainer->layout()->update(); @@ -3027,7 +3176,7 @@ void StyleEditor::onStyleSwitched() { if (!palette) { // set the current page to empty - m_styleChooser->setCurrentIndex(6); + m_styleChooser->setCurrentIndex(7); enable(false); m_colorParameterSelector->clear(); m_oldStyle = TColorStyleP(); diff --git a/toonz/sources/toonzqt/toonzqt.qrc b/toonz/sources/toonzqt/toonzqt.qrc index 6fc19a1..77c149f 100644 --- a/toonz/sources/toonzqt/toonzqt.qrc +++ b/toonz/sources/toonzqt/toonzqt.qrc @@ -10,12 +10,12 @@ Resources/bottomover.png Resources/bold_off.png Resources/bold_on.png - Resources/camera_off.png - Resources/camera_on.png + Resources/camera_off.svg + Resources/camera_on.svg Resources/camerastand_toggle.png Resources/camerastand_toggle_transp.png - Resources/centerselection_off.png - Resources/centerselection_on.png + Resources/centerselection_off.svg + Resources/centerselection_on.svg Resources/cleanup.png Resources/custom_off.svg Resources/custom_on.svg @@ -23,10 +23,10 @@ Resources/delete_over.png Resources/dragpalette.png Resources/dragpalette_over.png - Resources/fit_off.png - Resources/fit_on.png - Resources/fx_off.png - Resources/fx_on.png + Resources/fit_off.svg + Resources/fit_on.svg + Resources/fx_off.svg + Resources/fx_on.svg Resources/h_chandle.png Resources/icon.png Resources/italic_off.png @@ -39,37 +39,35 @@ Resources/folder_open.png Resources/folderanim_close.png Resources/folderanim_open.png - Resources/key_no.png - Resources/key_no_over.png - Resources/key_partial.png - Resources/key_partial_over.png - Resources/key_total.png - Resources/key_total_over.png + Resources/key_no.svg + Resources/key_no_over.svg + Resources/key_partial.svg + Resources/key_partial_over.svg + Resources/key_total.svg + Resources/key_total_over.svg Resources/magpie.png - Resources/maximizenodes_off.png - Resources/maximizenodes_on.png - Resources/minimizenodes_off.png - Resources/minimizenodes_on.png - Resources/motionpath_off.png - Resources/motionpath_on.png - Resources/newfolder.png - Resources/newfolder_over.png - Resources/newpage.png - Resources/newpage_over.png + Resources/maximizenodes_off.svg + Resources/maximizenodes_on.svg + Resources/minimizenodes_off.svg + Resources/minimizenodes_on.svg + Resources/motionpath_off.svg + Resources/motionpath_on.svg + Resources/newfolder.svg + Resources/newfolder_over.svg + Resources/newpage.svg + Resources/newpage_over.svg Resources/newpalette.png Resources/newpalette_over.png - Resources/newstyle.png - Resources/newstyle_click.png - Resources/newstyle_over.png - Resources/nextkey.png - Resources/nextkey_disabled.png - Resources/nextkey_over.png + Resources/newstyle.svg + Resources/newstyle_over.svg + Resources/nextkey.svg + Resources/nextkey_disabled.svg + Resources/nextkey_over.svg Resources/no_specialstyle.png - Resources/options.png - Resources/options_click.png - Resources/options_over.png - Resources/output_off.png - Resources/output_on.png + Resources/options.svg + Resources/options_over.svg + Resources/output_off.svg + Resources/output_on.svg Resources/palette.png Resources/palette_add_color.bmp Resources/palette_tabicon.png @@ -79,36 +77,39 @@ Resources/param_on.png Resources/paramanim_off.png Resources/paramanim_on.png - Resources/pegbar_off.png - Resources/pegbar_on.png + Resources/pegbar_off.svg + Resources/pegbar_on.svg Resources/plaincolor_off.svg Resources/plaincolor_on.svg - Resources/reorder_off.png - Resources/reorder_on.png - Resources/resetsize_off.png - Resources/resetsize_on.png + Resources/reorder_off.svg + Resources/reorder_on.svg + Resources/resetsize_off.svg + Resources/resetsize_on.svg Resources/settings_off.svg Resources/settings_on.svg - Resources/preview_black_off.png - Resources/preview_black_on.png - Resources/preview_black_over.png - Resources/preview_checkboard_off.png - Resources/preview_checkboard_on.png - Resources/preview_checkboard_over.png - Resources/preview_off.png - Resources/preview_on.png - Resources/preview_over.png + Resources/preview_black_off.svg + Resources/preview_black_on.svg + Resources/preview_black_over.svg + Resources/preview_checkboard_off.svg + Resources/preview_checkboard_on.svg + Resources/preview_checkboard_over.svg + Resources/preview_off.svg + Resources/preview_on.svg + Resources/preview_over.svg Resources/preview_toggle.png - Resources/preview_white_off.png - Resources/preview_white_on.png - Resources/preview_white_over.png - Resources/prevkey.png - Resources/prevkey_disabled.png - Resources/prevkey_over.png + Resources/preview_white_off.svg + Resources/preview_white_on.svg + Resources/preview_white_over.svg + Resources/prevkey.svg + Resources/prevkey_disabled.svg + Resources/prevkey_over.svg Resources/resizeColumnNode.svg Resources/savepalette.png + Resources/save.svg Resources/savepalette_click.png + Resources/save_click.svg Resources/savepalette_over.png + Resources/save_over.svg Resources/saveas_on.png Resources/saveas_off.png Resources/schematic_spin_arrows.svg @@ -128,8 +129,8 @@ Resources/sizemedium_over.png Resources/special_off.svg Resources/special_on.svg - Resources/swap_off.png - Resources/swap_on.png + Resources/swap_off.svg + Resources/swap_on.svg Resources/tasklist.png Resources/text_edit_button.png Resources/texture_off.svg @@ -137,25 +138,25 @@ Resources/underline_off.png Resources/underline_on.png Resources/v_chandle.png - Resources/viewcamera_off.png - Resources/viewcamera_on.png - Resources/viewcamera_over.png + Resources/viewcamera_off.svg + Resources/viewcamera_on.svg + Resources/viewcamera_over.svg Resources/unknown.png Resources/audio.png Resources/broken.png - Resources/opacitycheck_off.png - Resources/opacitycheck_on.png - Resources/opacitycheck_over.png + Resources/opacitycheck_off.svg + Resources/opacitycheck_on.svg + Resources/opacitycheck_over.svg Resources/tmsg_info.png Resources/tmsg_error.png Resources/tmsg_warning.png - Resources/lockpalette_off.png - Resources/lockpalette_on.png - Resources/lockpalette_over.png - Resources/savepalette_off.png - Resources/savepalette_on.png - Resources/savepaletteas_off.png - Resources/savepaletteas_on.png + Resources/lockpalette_off.svg + Resources/lockpalette_on.svg + Resources/lockpalette_over.svg + Resources/savepalette_off.svg + Resources/savepalette_on.svg + Resources/savepaletteas_off.svg + Resources/savepaletteas_on.svg Resources/studiopalette.png Resources/grad_r.png Resources/grad_g.png @@ -176,10 +177,10 @@ Resources/schematic_prev_eye.png Resources/schematic_table_view.png Resources/schematic_table_view_transp.png - Resources/fxport_red.png - Resources/fxport_blue.png + Resources/fxport_red.svg + Resources/fxport_blue.svg Resources/cachefx.png - Resources/schematic_link.png + Resources/schematic_link.svg Resources/schematic_thumbtoggle_on.png Resources/schematic_thumbtoggle_off.png Resources/dragcursor_exp_text.png @@ -303,9 +304,9 @@ Resources/keyframe_key.png Resources/keyframe_modified.png Resources/keyframe_inbetween.png - Resources/switchport_on.png - Resources/switchport_off.png - Resources/switchport_over.png + Resources/switchport_on.svg + Resources/switchport_off.svg + Resources/switchport_over.svg Resources/plus.png