Merge branch 'blender-v2.81-release'

This commit is contained in:
Campbell Barton
2019-10-15 14:22:52 +11:00

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);