Blender V5.0
MOD_hue_correct.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "BLI_math_color.h"
10
11#include "BKE_colortools.hh"
12
13#include "BLT_translation.hh"
14
15#include "DNA_curve_enums.h"
16#include "DNA_sequence_types.h"
17
18#include "SEQ_modifier.hh"
19
20#include "UI_interface.hh"
22
23#include "modifier.hh"
24
25namespace blender::seq {
26
28{
30 int c;
31
32 BKE_curvemapping_set_defaults(&hcmd->curve_mapping, 1, 0.0f, 0.0f, 1.0f, 1.0f, HD_AUTO);
34
35 for (c = 0; c < 3; c++) {
36 CurveMap *cuma = &hcmd->curve_mapping.cm[c];
39 }
40 /* use wrapping for all hue correct modifiers */
42 /* default to showing Saturation */
43 hcmd->curve_mapping.cur = 1;
44}
45
52
60
63
64 template<typename ImageT, typename MaskSampler>
65 void apply(ImageT *image, MaskSampler &mask, int image_x, IndexRange y_range)
66 {
67 image += y_range.first() * image_x * 4;
68 for (int64_t y : y_range) {
69 mask.begin_row(y);
70 for ([[maybe_unused]] int64_t x : IndexRange(image_x)) {
71 /* NOTE: arguably incorrect usage of "raw" values, should be un-premultiplied.
72 * Not changing behavior for now, but would be good to fix someday. */
75 result.w = input.w;
76
77 float3 hsv;
78 rgb_to_hsv(input.x, input.y, input.z, &hsv.x, &hsv.y, &hsv.z);
79
80 /* adjust hue, scaling returned default 0.5 up to 1 */
81 float f;
82 f = BKE_curvemapping_evaluateF(this->curve_mapping, 0, hsv.x);
83 hsv.x += f - 0.5f;
84
85 /* adjust saturation, scaling returned default 0.5 up to 1 */
86 f = BKE_curvemapping_evaluateF(this->curve_mapping, 1, hsv.x);
87 hsv.y *= (f * 2.0f);
88
89 /* adjust value, scaling returned default 0.5 up to 1 */
90 f = BKE_curvemapping_evaluateF(this->curve_mapping, 2, hsv.x);
91 hsv.z *= (f * 2.0f);
92
93 hsv.x = hsv.x - floorf(hsv.x); /* mod 1.0 */
94 hsv.y = math::clamp(hsv.y, 0.0f, 1.0f);
95
96 /* convert back to rgb */
97 hsv_to_rgb(hsv.x, hsv.y, hsv.z, &result.x, &result.y, &result.z);
98
99 mask.apply_mask(input, result);
100 store_pixel_raw(result, image);
101 image += 4;
102 }
103 }
104 }
105};
106
108{
110
112
114 op.curve_mapping = &hcmd->curve_mapping;
115 apply_modifier_op(op, context.image, mask, context.transform);
116}
117
118static void hue_correct_panel_draw(const bContext *C, Panel *panel)
119{
120 uiLayout *layout = panel->layout;
122
123 uiTemplateCurveMapping(layout, ptr, "curve_mapping", 'h', false, false, false, false, false);
124
125 if (uiLayout *mask_input_layout = layout->panel_prop(
126 C, ptr, "open_mask_input_panel", IFACE_("Mask Input")))
127 {
128 draw_mask_input_type_settings(C, mask_input_layout, ptr);
129 }
130}
131
136
137static void hue_correct_write(BlendWriter *writer, const StripModifierData *smd)
138{
139 const HueCorrectModifierData *hmd = reinterpret_cast<const HueCorrectModifierData *>(smd);
141}
142
144{
145 HueCorrectModifierData *hmd = reinterpret_cast<HueCorrectModifierData *>(smd);
147}
148
150 /*idname*/ "HueCorrect",
151 /*name*/ CTX_N_(BLT_I18NCONTEXT_ID_SEQUENCE, "Hue Correct"),
152 /*struct_name*/ "HueCorrectModifierData",
153 /*struct_size*/ sizeof(HueCorrectModifierData),
154 /*init_data*/ hue_correct_init_data,
155 /*free_data*/ hue_correct_free_data,
156 /*copy_data*/ hue_correct_copy_data,
157 /*apply*/ hue_correct_apply,
158 /*panel_register*/ hue_correct_register,
159 /*blend_write*/ hue_correct_write,
160 /*blend_read*/ hue_correct_read,
161};
162
163}; // namespace blender::seq
void BKE_curvemap_reset(CurveMap *cuma, const rctf *clipr, int preset, CurveMapSlopeType slope)
void BKE_curvemapping_free_data(CurveMapping *cumap)
float BKE_curvemapping_evaluateF(const CurveMapping *cumap, int cur, float value)
void BKE_curvemapping_blend_read(BlendDataReader *reader, CurveMapping *cumap)
void BKE_curvemapping_set_defaults(CurveMapping *cumap, int tot, float minx, float miny, float maxx, float maxy, short default_handle_type)
Definition colortools.cc:40
void BKE_curvemapping_init(CurveMapping *cumap)
void BKE_curvemapping_blend_write(BlendWriter *writer, const CurveMapping *cumap)
void BKE_curvemapping_copy_data(CurveMapping *target, const CurveMapping *cumap)
void rgb_to_hsv(float r, float g, float b, float *r_h, float *r_s, float *r_v)
void hsv_to_rgb(float h, float s, float v, float *r_r, float *r_g, float *r_b)
Definition math_color.cc:21
#define CTX_N_(context, msgid)
#define BLT_I18NCONTEXT_ID_SEQUENCE
#define IFACE_(msgid)
@ CUMA_USE_WRAPPING
@ CURVE_PRESET_MID8
@ HD_AUTO
@ eSeqModifierType_HueCorrect
#define C
Definition RandGen.cpp:29
void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname, int type, bool levels, bool brush, bool neg_slope, bool tone, bool presets)
PointerRNA * UI_panel_custom_data_get(const Panel *panel)
long long int int64_t
constexpr int64_t first() const
#define input
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
T clamp(const T &a, const T &min, const T &max)
void store_pixel_raw(float4 pix, uchar *ptr)
void draw_mask_input_type_settings(const bContext *C, uiLayout *layout, PointerRNA *ptr)
StripModifierTypeInfo seqModifierType_HueCorrect
static void hue_correct_register(ARegionType *region_type)
void apply_modifier_op(T &op, ImBuf *ibuf, const ImBuf *mask, const float3x3 &mask_transform)
Definition modifier.hh:263
static void hue_correct_write(BlendWriter *writer, const StripModifierData *smd)
static void hue_correct_init_data(StripModifierData *smd)
float4 load_pixel_raw(const uchar *ptr)
static void hue_correct_free_data(StripModifierData *smd)
static void hue_correct_panel_draw(const bContext *C, Panel *panel)
static void hue_correct_copy_data(StripModifierData *target, StripModifierData *smd)
static void hue_correct_apply(ModifierApplyContext &context, StripModifierData *smd, ImBuf *mask)
PanelType * modifier_panel_register(ARegionType *region_type, const eStripModifierType type, PanelDrawFn draw)
static void hue_correct_read(BlendDataReader *reader, StripModifierData *smd)
VecBase< float, 4 > float4
VecBase< float, 3 > float3
#define floorf
CurveMap cm[4]
struct CurveMapping curve_mapping
struct uiLayout * layout
const CurveMapping * curve_mapping
void apply(ImageT *image, MaskSampler &mask, int image_x, IndexRange y_range)
PanelLayout panel_prop(const bContext *C, PointerRNA *open_prop_owner, blender::StringRefNull open_prop_name)
PointerRNA * ptr
Definition wm_files.cc:4238