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:
committed by
Aras Pranckevicius
parent
1260e90b4c
commit
23242002c4
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user