Fix T70812: AppTemplate Splash image is not loading

Allow different splash heights, without this changes the the
default splash would stop app templates splash screen from loading.

This also allows the default splash height to change without
manually editing the layout.
This commit is contained in:
Campbell Barton 2019-10-15 13:23:09 +11:00
parent abd7ad01b8
commit 46102cf4e0
Notes: blender-bot 2023-02-14 09:33:11 +01:00
Referenced by commit 725b59d9b4, Fix T70903: Opening splash screen from named app_template crashes
Referenced by issue #70812, Application Template Splash Screen image is not loading as expected
1 changed files with 61 additions and 47 deletions

View File

@ -178,68 +178,79 @@ static void wm_block_splash_add_labels(uiBlock *block, int x, int y)
#endif /* WITH_BUILDINFO */
}
static ImBuf *wm_block_splash_image(void)
static ImBuf *wm_block_splash_image(int r_unit_size[2])
{
#ifndef WITH_HEADLESS
extern char datatoc_splash_png[];
extern int datatoc_splash_png_size;
extern char datatoc_splash_2x_png[];
extern int datatoc_splash_2x_png_size;
const bool is_2x = U.dpi_fac > 1.0;
const int imb_scale = is_2x ? 2 : 1;
/* We could allow this to be variable,
* for now don't since allowing it might create layout issues.
*
* Only check width because splashes sometimes change height
* and we don't want to break app-templates. */
const int x_expect = 501 * imb_scale;
ImBuf *ibuf = NULL;
if (U.dpi_fac > 1.0) {
ibuf = IMB_ibImageFromMemory((const uchar *)datatoc_splash_2x_png,
datatoc_splash_2x_png_size,
IB_rect,
NULL,
"<splash screen>");
}
else {
ibuf = IMB_ibImageFromMemory((const uchar *)datatoc_splash_png,
datatoc_splash_png_size,
IB_rect,
NULL,
"<splash screen>");
}
/* overwrite splash with template image */
if (U.app_template[0] != '\0') {
ImBuf *ibuf_template = NULL;
char splash_filepath[FILE_MAX];
char template_directory[FILE_MAX];
if (BKE_appdir_app_template_id_search(
U.app_template, template_directory, sizeof(template_directory))) {
BLI_join_dirfile(splash_filepath,
sizeof(splash_filepath),
template_directory,
(U.dpi_fac > 1.0) ? "splash_2x.png" : "splash.png");
ibuf_template = IMB_loadiffname(splash_filepath, IB_rect, NULL);
if (ibuf_template) {
const int x_expect = ibuf->x;
const int y_expect = 250 * (int)U.dpi_fac;
/* don't cover the header text */
if (ibuf_template->x == x_expect && ibuf_template->y == y_expect) {
memcpy(ibuf->rect,
ibuf_template->rect,
ibuf_template->x * ibuf_template->y * sizeof(char[4]));
}
else {
CLOG_ERROR(WM_LOG_OPERATORS,
"Splash expected %dx%d found %dx%d, ignoring: %s\n",
x_expect,
y_expect,
ibuf_template->x,
ibuf_template->y,
splash_filepath);
}
IMB_freeImBuf(ibuf_template);
is_2x ? "splash_2x.png" : "splash.png");
ibuf = IMB_loadiffname(splash_filepath, IB_rect, NULL);
/* We could skip this check, see comment about 'x_expect' above. */
if (ibuf->x != x_expect) {
CLOG_ERROR(WM_LOG_OPERATORS,
"Splash expected %d width found %d, ignoring: %s\n",
x_expect,
ibuf->x,
splash_filepath);
IMB_freeImBuf(ibuf);
ibuf = NULL;
}
}
}
if (ibuf == NULL) {
const uchar *splash_data;
size_t splash_data_size;
if (is_2x) {
splash_data = (const uchar *)datatoc_splash_2x_png;
splash_data_size = datatoc_splash_2x_png_size;
}
else {
splash_data = (const uchar *)datatoc_splash_png;
splash_data_size = datatoc_splash_png_size;
}
ibuf = IMB_ibImageFromMemory(splash_data, splash_data_size, IB_rect, NULL, "<splash screen>");
BLI_assert(ibuf->x == x_expect);
}
if (is_2x) {
r_unit_size[0] = ibuf->x / 2;
r_unit_size[1] = ibuf->y / 2;
}
else {
r_unit_size[0] = ibuf->x;
r_unit_size[1] = ibuf->y;
}
return ibuf;
#else
UNUSED_VARS(r_unit_size);
return NULL;
#endif
}
@ -258,15 +269,17 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_KEEP_OPEN | UI_BLOCK_NO_WIN_CLIP);
UI_block_theme_style_set(block, UI_BLOCK_THEME_STYLE_POPUP);
ImBuf *ibuf = wm_block_splash_image();
/* Size before dpi scaling (halved for hi-dpi image). */
int ibuf_unit_size[2];
ImBuf *ibuf = wm_block_splash_image(ibuf_unit_size);
but = uiDefBut(block,
UI_BTYPE_IMAGE,
0,
"",
0,
0.5f * U.widget_unit,
U.dpi_fac * 501,
U.dpi_fac * 250,
U.dpi_fac * ibuf_unit_size[0],
U.dpi_fac * ibuf_unit_size[1],
/* Button owns the imbuf now. */
ibuf,
0.0,
@ -277,17 +290,18 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
UI_but_func_set(but, wm_block_splash_close, block, NULL);
UI_block_func_set(block, wm_block_splash_refreshmenu, block, NULL);
int x = U.dpi_fac * 502;
int y = U.dpi_fac * 237;
int x = U.dpi_fac * (ibuf_unit_size[0] + 1);
int y = U.dpi_fac * (ibuf_unit_size[1] - 13);
wm_block_splash_add_labels(block, x, y);
const int layout_margin_x = U.dpi_fac * 26;
uiLayout *layout = UI_block_layout(block,
UI_LAYOUT_VERTICAL,
UI_LAYOUT_PANEL,
U.dpi_fac * 26,
layout_margin_x,
0,
U.dpi_fac * 450,
(U.dpi_fac * ibuf_unit_size[0]) - (layout_margin_x * 2),
U.dpi_fac * 110,
0,
style);