Blender V4.3
COM_ScaleOperation.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
8
9namespace blender::compositor {
10
12
13 public:
18 void set_variable_size(bool variable_size)
19 {
20 variable_size_ = variable_size;
21 };
22
23 protected:
25
30
33};
34
36 public:
37 static constexpr float MIN_RELATIVE_SCALE = 0.0001f;
38
39 protected:
40 static constexpr int IMAGE_INPUT_INDEX = 0;
41 static constexpr int X_INPUT_INDEX = 1;
42 static constexpr int Y_INPUT_INDEX = 2;
43
46
47 public:
49 ScaleOperation(DataType data_type);
50
51 static float scale_coord(const float coord, const float center, const float relative_scale)
52 {
53 return center + (coord - center) * std::max(relative_scale, MIN_RELATIVE_SCALE);
54 }
55
56 static float scale_coord_inverted(const float coord,
57 const float center,
58 const float relative_scale)
59 {
60 return center + (coord - center) / std::max(relative_scale, MIN_RELATIVE_SCALE);
61 }
62
63 static void get_scale_offset(const rcti &input_canvas,
64 const rcti &scale_canvas,
65 float &r_scale_offset_x,
66 float &r_scale_offset_y);
67 static void scale_area(rcti &area, float relative_scale_x, float relative_scale_y);
68 static void get_scale_area_of_interest(const rcti &input_canvas,
69 const rcti &scale_canvas,
70 float relative_scale_x,
71 float relative_scale_y,
72 const rcti &output_area,
73 rcti &r_input_area);
74 static void clamp_area_size_max(rcti &area, Size2f max_size);
75
76 void init_data() override;
77
78 void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
80 const rcti &area,
81 Span<MemoryBuffer *> inputs) override;
82
83 void determine_canvas(const rcti &preferred_area, rcti &r_area) override;
84
85 protected:
86 virtual float get_relative_scale_x_factor(float width) = 0;
87 virtual float get_relative_scale_y_factor(float height) = 0;
88
89 private:
90 bool is_scaling_variable();
91 float get_constant_scale(int input_op_idx, float factor);
92 float get_constant_scale_x(float width);
93 float get_constant_scale_y(float height);
94};
95
97 public:
100
101 float get_relative_scale_x_factor(float /*width*/) override
102 {
103 return 1.0f;
104 }
105
106 float get_relative_scale_y_factor(float /*height*/) override
107 {
108 return 1.0f;
109 }
110};
111
113 public:
114 float get_relative_scale_x_factor(float width) override
115 {
116 return 1.0f / width;
117 }
118
119 float get_relative_scale_y_factor(float height) override
120 {
121 return 1.0f / height;
122 }
123};
124
126 int new_width_;
127 int new_height_;
128 float rel_x_;
129 float rel_y_;
130
131 /* center is only used for aspect correction */
132 float offset_x_;
133 float offset_y_;
134 bool is_aspect_;
135 bool is_crop_;
136 /* set from other properties on initialization,
137 * check if we need to apply offset */
138 bool is_offset_;
139
140 public:
143 void determine_canvas(const rcti &preferred_area, rcti &r_area) override;
144
145 void set_new_width(int width)
146 {
147 new_width_ = width;
148 }
149 void set_new_height(int height)
150 {
151 new_height_ = height;
152 }
153 void set_is_aspect(bool is_aspect)
154 {
155 is_aspect_ = is_aspect;
156 }
157 void set_is_crop(bool is_crop)
158 {
159 is_crop_ = is_crop;
160 }
161 void set_offset(float x, float y)
162 {
163 offset_x_ = x;
164 offset_y_ = y;
165 }
166
167 void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
169 const rcti &area,
170 Span<MemoryBuffer *> inputs) override;
171
172 private:
173 void init_data(const rcti &input_canvas);
174};
175
176} // namespace blender::compositor
PixelSampler get_effective_sampler(PixelSampler sampler)
a MemoryBuffer contains access to the data
float get_relative_scale_x_factor(float width) override
float get_relative_scale_y_factor(float height) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
static void get_scale_offset(const rcti &input_canvas, const rcti &scale_canvas, float &r_scale_offset_x, float &r_scale_offset_y)
static void get_scale_area_of_interest(const rcti &input_canvas, const rcti &scale_canvas, float relative_scale_x, float relative_scale_y, const rcti &output_area, rcti &r_input_area)
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
virtual float get_relative_scale_x_factor(float width)=0
static void scale_area(rcti &area, float relative_scale_x, float relative_scale_y)
static float scale_coord_inverted(const float coord, const float center, const float relative_scale)
virtual float get_relative_scale_y_factor(float height)=0
static constexpr float MIN_RELATIVE_SCALE
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
static void clamp_area_size_max(rcti &area, Size2f max_size)
static float scale_coord(const float coord, const float center, const float relative_scale)
local_group_size(16, 16) .push_constant(Type local_group_size(16, 16) .push_constant(Type input_tx sampler(1, ImageType::FLOAT_2D, "matte_tx") .image(0
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
DataType
possible data types for sockets
Definition COM_defines.h:21