Cleanup: add get_render_scale_factor helper to use across VSE, proxy size type safety

- Some functions that took integer arguments for proxy size enums; make
  them take said enums directly.
- Add get_render_scale_factor() that calculates effective render scale,
  use that in places that did manual "use either scene render scale setting
  or proxy size" calculation in 5 places.
- Replace previous double with float in proxy size scale factors; all
  the factors are exactly representable as floats, and all the calling
  places used them as floats too.
This commit is contained in:
Aras Pranckevicius
2025-07-30 16:05:27 +03:00
committed by Aras Pranckevicius
parent 1260e90b4c
commit 23242002c4
12 changed files with 75 additions and 64 deletions

View File

@@ -104,7 +104,7 @@ static eSpaceSeq_Proxy_RenderSize get_sequencer_render_size(Main *bmain)
return render_size;
}
static bool can_use_proxy(const Strip *strip, int psize)
static bool can_use_proxy(const Strip *strip, IMB_Proxy_Size psize)
{
if (strip->data->proxy == nullptr) {
return false;
@@ -1828,7 +1828,7 @@ void blo_do_versions_290(FileData *fd, Library * /*lib*/, Main *bmain)
{
sseq->flag |= SEQ_USE_PROXIES;
}
if (sseq->render_size == SEQ_RENDER_SIZE_FULL) {
if (sseq->render_size == SEQ_RENDER_SIZE_FULL_DEPRECATED) {
sseq->render_size = SEQ_RENDER_SIZE_PROXY_100;
}
}

View File

@@ -993,7 +993,7 @@ static void sequencer_add_free(bContext * /*C*/, wmOperator *op)
static IMB_Proxy_Size seq_get_proxy_size_flags(bContext *C)
{
bScreen *screen = CTX_wm_screen(C);
IMB_Proxy_Size proxy_sizes = IMB_Proxy_Size(0);
IMB_Proxy_Size proxy_sizes = IMB_PROXY_NONE;
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
switch (sl->spacetype) {
@@ -1002,7 +1002,8 @@ static IMB_Proxy_Size seq_get_proxy_size_flags(bContext *C)
if (!ELEM(sseq->view, SEQ_VIEW_PREVIEW, SEQ_VIEW_SEQUENCE_PREVIEW)) {
continue;
}
proxy_sizes |= IMB_Proxy_Size(seq::rendersize_to_proxysize(sseq->render_size));
proxy_sizes |= seq::rendersize_to_proxysize(
eSpaceSeq_Proxy_RenderSize(sseq->render_size));
}
}
}

View File

@@ -115,26 +115,19 @@ ImBuf *sequencer_ibuf_get(const bContext *C, const int timeline_frame, const cha
seq::RenderData context = {nullptr};
ImBuf *ibuf;
int rectx, recty;
double render_size;
short is_break = G.is_break;
if (sseq->render_size == SEQ_RENDER_SIZE_NONE) {
const eSpaceSeq_Proxy_RenderSize render_size_mode = eSpaceSeq_Proxy_RenderSize(
sseq->render_size);
if (render_size_mode == SEQ_RENDER_SIZE_NONE) {
return nullptr;
}
if (sseq->render_size == SEQ_RENDER_SIZE_SCENE) {
render_size = scene->r.size / 100.0;
}
else {
render_size = seq::rendersize_to_scale_factor(sseq->render_size);
}
rectx = roundf(render_size * scene->r.xsch);
recty = roundf(render_size * scene->r.ysch);
const float render_scale = seq::get_render_scale_factor(render_size_mode, scene->r.size);
int rectx = roundf(render_scale * scene->r.xsch);
int recty = roundf(render_scale * scene->r.ysch);
seq::render_new_render_data(
bmain, depsgraph, scene, rectx, recty, sseq->render_size, false, &context);
bmain, depsgraph, scene, rectx, recty, render_size_mode, false, &context);
context.view_id = BKE_scene_multiview_view_id_get(&scene->r, viewname);
context.use_proxies = (sseq->flag & SEQ_USE_PROXIES) != 0;
context.is_playing = screen->animtimer != nullptr;

View File

@@ -441,7 +441,7 @@ typedef enum eSpaceSeq_Proxy_RenderSize {
SEQ_RENDER_SIZE_PROXY_50 = 50,
SEQ_RENDER_SIZE_PROXY_75 = 75,
SEQ_RENDER_SIZE_PROXY_100 = 99,
SEQ_RENDER_SIZE_FULL = 100,
SEQ_RENDER_SIZE_FULL_DEPRECATED = 100, /* deprecated, for versioning only */
} eSpaceSeq_Proxy_RenderSize;
/** #SpaceSeq.gizmo_flag */

View File

@@ -338,10 +338,8 @@ typedef struct SpaceSeq {
/** Deprecated: offset for drawing the image preview. */
float xof DNA_DEPRECATED, yof DNA_DEPRECATED;
/** Weird name for the sequencer subtype (seq, image, luma... etc). */
short mainb;
/** ESpaceSeq_Proxy_RenderSize. */
short render_size;
short mainb; /* eSpaceSeq_RegionType; strange name for view type (image, histogram, ...). */
short render_size; /* eSpaceSeq_Proxy_RenderSize. */
short chanshown;
short zebra;
int flag;

View File

@@ -2534,7 +2534,7 @@ static void seq_build_proxy(bContext *C, PointerRNA *ptr)
/* Add new proxy size. */
strip->data->proxy->build_size_flags |= blender::seq::rendersize_to_proxysize(
sseq->render_size);
eSpaceSeq_Proxy_RenderSize(sseq->render_size));
/* Build proxy. */
blender::seq::proxy_rebuild_context(

View File

@@ -9,9 +9,12 @@
*/
#include "DNA_listBase.h"
#include "DNA_space_enums.h"
#include "BLI_set.hh"
#include "IMB_imbuf_enums.h"
struct Depsgraph;
struct ListBase;
struct Main;
@@ -36,9 +39,9 @@ bool proxy_rebuild_context(Main *bmain,
void proxy_rebuild(IndexBuildContext *context, wmJobWorkerStatus *worker_status);
void proxy_rebuild_finish(IndexBuildContext *context, bool stop);
void proxy_set(Strip *strip, bool value);
bool can_use_proxy(const RenderData *context, const Strip *strip, int psize);
int rendersize_to_proxysize(int render_size);
double rendersize_to_scale_factor(int render_size);
bool can_use_proxy(const RenderData *context, const Strip *strip, IMB_Proxy_Size psize);
IMB_Proxy_Size rendersize_to_proxysize(eSpaceSeq_Proxy_RenderSize render_size);
float rendersize_to_scale_factor(eSpaceSeq_Proxy_RenderSize render_size);
struct ProxyJob {
Main *main;

View File

@@ -8,6 +8,8 @@
* \ingroup sequencer
*/
#include "DNA_space_enums.h"
struct Depsgraph;
struct GPUOffScreen;
struct GPUViewport;
@@ -31,7 +33,7 @@ struct RenderData {
Scene *scene = nullptr;
int rectx = 0;
int recty = 0;
int preview_render_size = 0;
eSpaceSeq_Proxy_RenderSize preview_render_size = SEQ_RENDER_SIZE_SCENE;
bool use_proxies = false;
bool ignore_missing_media = false;
int for_render = 0;
@@ -65,7 +67,7 @@ void render_new_render_data(Main *bmain,
Scene *scene,
int rectx,
int recty,
int preview_render_size,
eSpaceSeq_Proxy_RenderSize preview_render_size,
int for_render,
RenderData *r_context);
StripElem *render_give_stripelem(const Scene *scene, const Strip *strip, int timeline_frame);
@@ -78,4 +80,11 @@ void render_pixel_from_sequencer_space_v4(const Scene *scene, float pixel[4]);
*/
bool render_is_muted(const ListBase *channels, const Strip *strip);
/**
* Calculate render scale factor relative to full size. This can be due to render
* scale setting in output settings, or preview proxy size.
*/
float get_render_scale_factor(eSpaceSeq_Proxy_RenderSize render_size, short scene_render_scale);
float get_render_scale_factor(const RenderData &context);
} // namespace blender::seq

View File

@@ -776,18 +776,14 @@ static int text_effect_line_size_get(const RenderData *context, const Strip *str
{
TextVars *data = static_cast<TextVars *>(strip->effectdata);
/* Used to calculate boundbox. Proxy size compensation is not needed there. */
/* Used to calculate boundbox. Render scale compensation is not needed there. */
if (context == nullptr) {
return data->text_size;
}
/* Compensate text size for preview render size. */
double proxy_size_comp = context->scene->r.size / 100.0;
if (context->preview_render_size != SEQ_RENDER_SIZE_SCENE) {
proxy_size_comp = rendersize_to_scale_factor(context->preview_render_size);
}
return proxy_size_comp * data->text_size;
/* Compensate for preview render size. */
const float size_scale = seq::get_render_scale_factor(*context);
return size_scale * data->text_size;
}
int text_effect_font_init(const RenderData *context, const Strip *strip, int font_flags)

View File

@@ -156,14 +156,10 @@ static ImBuf *do_transform_effect(const RenderData *context,
/* Translate */
float translate_x, translate_y;
if (!transform->percent) {
/* Compensate text size for preview render size. */
double proxy_size_comp = context->scene->r.size / 100.0;
if (context->preview_render_size != SEQ_RENDER_SIZE_SCENE) {
proxy_size_comp = rendersize_to_scale_factor(context->preview_render_size);
}
translate_x = transform->xIni * proxy_size_comp + (x / 2.0f);
translate_y = transform->yIni * proxy_size_comp + (y / 2.0f);
/* Compensate for render scale. */
const float size_scale = seq::get_render_scale_factor(*context);
translate_x = transform->xIni * size_scale + (x / 2.0f);
translate_y = transform->yIni * size_scale + (y / 2.0f);
}
else {
translate_x = x * (transform->xIni / 100.0f) + (x / 2.0f);

View File

@@ -68,7 +68,7 @@ struct IndexBuildContext {
SessionUID orig_seq_uid;
};
int rendersize_to_proxysize(int render_size)
IMB_Proxy_Size rendersize_to_proxysize(eSpaceSeq_Proxy_RenderSize render_size)
{
switch (render_size) {
case SEQ_RENDER_SIZE_PROXY_25:
@@ -79,21 +79,23 @@ int rendersize_to_proxysize(int render_size)
return IMB_PROXY_75;
case SEQ_RENDER_SIZE_PROXY_100:
return IMB_PROXY_100;
default:
return IMB_PROXY_NONE;
}
return IMB_PROXY_NONE;
}
double rendersize_to_scale_factor(int render_size)
float rendersize_to_scale_factor(eSpaceSeq_Proxy_RenderSize render_size)
{
switch (render_size) {
case SEQ_RENDER_SIZE_PROXY_25:
return 0.25;
return 0.25f;
case SEQ_RENDER_SIZE_PROXY_50:
return 0.50;
return 0.5f;
case SEQ_RENDER_SIZE_PROXY_75:
return 0.75;
return 0.75f;
default:
return 1.0f;
}
return 1.0;
}
bool seq_proxy_get_custom_file_filepath(Strip *strip, char *filepath, const int view_id)
@@ -188,7 +190,7 @@ static bool seq_proxy_get_filepath(Scene *scene,
return true;
}
bool can_use_proxy(const RenderData *context, const Strip *strip, int psize)
bool can_use_proxy(const RenderData *context, const Strip *strip, IMB_Proxy_Size psize)
{
if (strip->data->proxy == nullptr || !context->use_proxies) {
return false;
@@ -542,8 +544,14 @@ void proxy_rebuild(IndexBuildContext *context, wmJobWorkerStatus *worker_status)
int width, height;
BKE_render_resolution(&scene->r, false, &width, &height);
render_new_render_data(
bmain, context->depsgraph, context->scene, width, height, 100, false, &render_context);
render_new_render_data(bmain,
context->depsgraph,
context->scene,
width,
height,
SEQ_RENDER_SIZE_PROXY_100,
false,
&render_context);
render_context.skip_cache = true;
render_context.is_proxy_render = true;

View File

@@ -208,7 +208,7 @@ void render_new_render_data(Main *bmain,
Scene *scene,
int rectx,
int recty,
int preview_render_size,
eSpaceSeq_Proxy_RenderSize preview_render_size,
int for_render,
RenderData *r_context)
{
@@ -281,9 +281,7 @@ StripScreenQuad get_strip_screen_quad(const RenderData *context, const Strip *st
const float2 offset{x * 0.5f, y * 0.5f};
Array<float2> quad = image_transform_final_quad_get(scene, strip);
const float scale = context->preview_render_size == SEQ_RENDER_SIZE_SCENE ?
float(scene->r.size) / 100.0f :
rendersize_to_scale_factor(context->preview_render_size);
const float scale = get_render_scale_factor(*context);
return StripScreenQuad{float2(quad[0] * scale + offset),
float2(quad[1] * scale + offset),
float2(quad[2] * scale + offset),
@@ -538,9 +536,7 @@ static void sequencer_preprocess_transform_crop(
ImBuf *in, ImBuf *out, const RenderData *context, Strip *strip, const bool is_proxy_image)
{
const Scene *scene = context->scene;
const float preview_scale_factor = context->preview_render_size == SEQ_RENDER_SIZE_SCENE ?
float(scene->r.size) / 100 :
rendersize_to_scale_factor(context->preview_render_size);
const float preview_scale_factor = get_render_scale_factor(*context);
const bool do_scale_to_render_size = seq_need_scale_to_render_size(strip, is_proxy_image);
const float image_scale_factor = do_scale_to_render_size ? preview_scale_factor : 1.0f;
@@ -1065,7 +1061,7 @@ static ImBuf *seq_render_movie_strip_view(const RenderData *context,
bool *r_is_proxy_image)
{
ImBuf *ibuf = nullptr;
IMB_Proxy_Size psize = IMB_Proxy_Size(rendersize_to_proxysize(context->preview_render_size));
IMB_Proxy_Size psize = rendersize_to_proxysize(context->preview_render_size);
const int frame_index = round_fl_to_int(give_frame_index(context->scene, strip, timeline_frame));
if (can_use_proxy(context, strip, psize)) {
@@ -1213,7 +1209,7 @@ static ImBuf *seq_render_movieclip_strip(const RenderData *context,
{
ImBuf *ibuf = nullptr;
MovieClipUser user = *DNA_struct_default_get(MovieClipUser);
IMB_Proxy_Size psize = IMB_Proxy_Size(rendersize_to_proxysize(context->preview_render_size));
IMB_Proxy_Size psize = rendersize_to_proxysize(context->preview_render_size);
if (!strip->clip) {
return nullptr;
@@ -2063,4 +2059,15 @@ bool render_is_muted(const ListBase *channels, const Strip *strip)
/** \} */
float get_render_scale_factor(eSpaceSeq_Proxy_RenderSize render_size, short scene_render_scale)
{
return render_size == SEQ_RENDER_SIZE_SCENE ? scene_render_scale / 100.0f :
rendersize_to_scale_factor(render_size);
}
float get_render_scale_factor(const RenderData &context)
{
return get_render_scale_factor(context.preview_render_size, context.scene->r.size);
}
} // namespace blender::seq