Merge branch 'master' into blender2.8

This commit is contained in:
2018-04-03 14:19:51 +02:00
31 changed files with 159 additions and 83 deletions

View File

@@ -253,6 +253,8 @@ option(WITH_OPENSUBDIV "Enable OpenSubdiv for surface subdivision" _init_OPEN
option(WITH_OPENVDB "Enable features relying on OpenVDB" OFF) option(WITH_OPENVDB "Enable features relying on OpenVDB" OFF)
option(WITH_OPENVDB_BLOSC "Enable blosc compression for OpenVDB, only enable if OpenVDB was built with blosc support" OFF) option(WITH_OPENVDB_BLOSC "Enable blosc compression for OpenVDB, only enable if OpenVDB was built with blosc support" OFF)
option(WITH_OPENVDB_3_ABI_COMPATIBLE "Assume OpenVDB library has been compiled with version 3 ABI compatibility" OFF)
mark_as_advanced(WITH_OPENVDB_3_ABI_COMPATIBLE)
# GHOST Windowing Library Options # GHOST Windowing Library Options
option(WITH_GHOST_DEBUG "Enable debugging output for the GHOST library" OFF) option(WITH_GHOST_DEBUG "Enable debugging output for the GHOST library" OFF)
@@ -1443,8 +1445,8 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_SIGN_COMPARE -Wno-sign-compare) ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_SIGN_COMPARE -Wno-sign-compare)
# disable numbered, false positives # disable numbered, false positives
set(C_WARNINGS "${C_WARNINGS} -wd188,186,144,913,556") set(C_WARNINGS "${C_WARNINGS} -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199")
set(CXX_WARNINGS "${CXX_WARNINGS} -wd188,186,144,913,556") set(CXX_WARNINGS "${CXX_WARNINGS} -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199")
elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC") elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
# most msvc warnings are C & C++ # most msvc warnings are C & C++
set(_WARNINGS set(_WARNINGS

View File

@@ -822,7 +822,7 @@ macro(TEST_SSE_SUPPORT
endif() endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
set(${_sse_flags} "") # icc defaults to -msse set(${_sse_flags} "") # icc defaults to -msse
set(${_sse2_flags} "-msse2") set(${_sse2_flags} "") # icc defaults to -msse2
else() else()
message(WARNING "SSE flags for this compiler: '${CMAKE_C_COMPILER_ID}' not known") message(WARNING "SSE flags for this compiler: '${CMAKE_C_COMPILER_ID}' not known")
set(${_sse_flags}) set(${_sse_flags})

View File

@@ -104,6 +104,54 @@ elseif(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
endif() endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CYCLES_KERNEL_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CYCLES_KERNEL_FLAGS}")
elseif(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Intel")
check_cxx_compiler_flag(/QxSSE2 CXX_HAS_SSE)
check_cxx_compiler_flag(/arch:AVX CXX_HAS_AVX)
check_cxx_compiler_flag(/QxCORE-AVX2 CXX_HAS_AVX2)
if(CXX_HAS_SSE)
set(CYCLES_SSE2_KERNEL_FLAGS "/QxSSE2")
set(CYCLES_SSE3_KERNEL_FLAGS "/QxSSSE3")
set(CYCLES_SSE41_KERNEL_FLAGS "/QxSSE4.1")
if(CXX_HAS_AVX)
set(CYCLES_AVX_KERNEL_FLAGS "/arch:AVX")
endif()
if(CXX_HAS_AVX2)
set(CYCLES_AVX2_KERNEL_FLAGS "/QxCORE-AVX2")
endif()
endif()
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
if(APPLE)
# ICC does not support SSE2 flag on MacOSX
check_cxx_compiler_flag(-xssse3 CXX_HAS_SSE)
else()
check_cxx_compiler_flag(-xsse2 CXX_HAS_SSE)
endif()
check_cxx_compiler_flag(-xavx CXX_HAS_AVX)
check_cxx_compiler_flag(-xcore-avx2 CXX_HAS_AVX2)
if(CXX_HAS_SSE)
if(APPLE)
# ICC does not support SSE2 flag on MacOSX
set(CYCLES_SSE2_KERNEL_FLAGS "-xssse3")
else()
set(CYCLES_SSE2_KERNEL_FLAGS "-xsse2")
endif()
set(CYCLES_SSE3_KERNEL_FLAGS "-xssse3")
set(CYCLES_SSE41_KERNEL_FLAGS "-xsse4.1")
if(CXX_HAS_AVX)
set(CYCLES_AVX_KERNEL_FLAGS "-xavx")
endif()
if(CXX_HAS_AVX2)
set(CYCLES_AVX2_KERNEL_FLAGS "-xcore-avx2")
endif()
endif()
endif() endif()
if(CXX_HAS_SSE) if(CXX_HAS_SSE)

View File

@@ -34,7 +34,6 @@ struct ccl_try_align(16) float4 {
}; };
__forceinline float4(); __forceinline float4();
__forceinline float4(const float4& a);
__forceinline explicit float4(const __m128& a); __forceinline explicit float4(const __m128& a);
__forceinline operator const __m128&(void) const; __forceinline operator const __m128&(void) const;

View File

@@ -33,11 +33,6 @@ __forceinline float4::float4()
{ {
} }
__forceinline float4::float4(const float4& a)
: m128(a.m128)
{
}
__forceinline float4::float4(const __m128& a) __forceinline float4::float4(const __m128& a)
: m128(a) : m128(a)
{ {

View File

@@ -38,8 +38,13 @@ set(SRC
if(WITH_OPENVDB) if(WITH_OPENVDB)
add_definitions( add_definitions(
-DWITH_OPENVDB -DWITH_OPENVDB
)
if(WITH_OPENVDB_3_ABI_COMPATIBLE)
add_definitions(
-DOPENVDB_3_ABI_COMPATIBLE -DOPENVDB_3_ABI_COMPATIBLE
) )
endif()
list(APPEND INC_SYS list(APPEND INC_SYS
${BOOST_INCLUDE_DIR} ${BOOST_INCLUDE_DIR}

View File

@@ -45,7 +45,7 @@ void OpenVDBWriter::insert(const openvdb::GridBase::Ptr &grid)
void OpenVDBWriter::insert(const openvdb::GridBase &grid) void OpenVDBWriter::insert(const openvdb::GridBase &grid)
{ {
#if (OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER >= 3) #if (OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER <= 3) || defined(OPENVDB_3_ABI_COMPATIBLE)
m_grids->push_back(grid.copyGrid()); m_grids->push_back(grid.copyGrid());
#else #else
m_grids->push_back(grid.copyGridWithNewTree()); m_grids->push_back(grid.copyGridWithNewTree());

View File

@@ -299,7 +299,10 @@ bool BKE_displist_surfindex_get(DispList *dl, int a, int *b, int *p1, int *p2, i
} }
/* ****************** make displists ********************* */ /* ****************** make displists ********************* */
#ifdef __INTEL_COMPILER
/* ICC with the optimization -02 causes crashes. */
# pragma intel optimization_level 1
#endif
static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase, static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase,
const bool for_render, const bool use_render_resolution) const bool for_render, const bool use_render_resolution)
{ {

View File

@@ -411,7 +411,7 @@ extern "C" {
} (void)0 } (void)0
/* assuming a static array */ /* assuming a static array */
#if defined(__GNUC__) && !defined(__cplusplus) && !defined(__clang__) #if defined(__GNUC__) && !defined(__cplusplus) && !defined(__clang__) && !defined(__INTEL_COMPILER)
# define ARRAY_SIZE(arr) \ # define ARRAY_SIZE(arr) \
((sizeof(struct {int isnt_array : ((const void *)&(arr) == &(arr)[0]);}) * 0) + \ ((sizeof(struct {int isnt_array : ((const void *)&(arr) == &(arr)[0]);}) * 0) + \
(sizeof(arr) / sizeof(*(arr)))) (sizeof(arr) / sizeof(*(arr))))

View File

@@ -46,7 +46,6 @@
#include "PIL_time.h" #include "PIL_time.h"
#include "BKE_main.h"
#include "BKE_paint.h" #include "BKE_paint.h"
#include "BKE_gpencil.h" #include "BKE_gpencil.h"
#include "BKE_context.h" #include "BKE_context.h"

View File

@@ -45,7 +45,6 @@
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_global.h" #include "BKE_global.h"
#include "BKE_gpencil.h" #include "BKE_gpencil.h"
#include "BKE_main.h"
#include "ED_gpencil.h" #include "ED_gpencil.h"

View File

@@ -51,6 +51,8 @@ void ED_undo_operator_repeat_cb_evt(struct bContext *C, void *arg_op, int arg
bool ED_undo_is_valid(const struct bContext *C, const char *undoname); bool ED_undo_is_valid(const struct bContext *C, const char *undoname);
struct UndoStack *ED_undo_stack_get(void);
/* undo_system_types.c */ /* undo_system_types.c */
void ED_undosys_type_init(void); void ED_undosys_type_init(void);
void ED_undosys_type_free(void); void ED_undosys_type_free(void);

View File

@@ -36,7 +36,6 @@
#include "BLI_listbase.h" #include "BLI_listbase.h"
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_main.h"
#include "BKE_object.h" #include "BKE_object.h"
#include "BKE_report.h" #include "BKE_report.h"
#include "BKE_editmesh.h" #include "BKE_editmesh.h"

View File

@@ -43,7 +43,6 @@
#include "BKE_DerivedMesh.h" #include "BKE_DerivedMesh.h"
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_main.h"
#include "BKE_mesh.h" #include "BKE_mesh.h"
#include "BKE_mesh_mapping.h" #include "BKE_mesh_mapping.h"
#include "BKE_report.h" #include "BKE_report.h"

View File

@@ -4436,6 +4436,7 @@ void PE_create_particle_edit(
recalc_lengths(edit); recalc_lengths(edit);
if (psys && !cache) if (psys && !cache)
recalc_emitter_field(ob, psys); recalc_emitter_field(ob, psys);
PE_update_object(eval_ctx, scene, ob, 1); PE_update_object(eval_ctx, scene, ob, 1);
} }
} }

View File

@@ -44,11 +44,9 @@
#include "BLI_string.h" #include "BLI_string.h"
#include "BLI_utildefines.h" #include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_particle.h" #include "BKE_particle.h"
#include "BKE_pointcache.h" #include "BKE_pointcache.h"
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_main.h"
#include "BKE_undo_system.h" #include "BKE_undo_system.h"
#include "DEG_depsgraph.h" #include "DEG_depsgraph.h"

View File

@@ -48,7 +48,6 @@
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_customdata.h" #include "BKE_customdata.h"
#include "BKE_fluidsim.h" #include "BKE_fluidsim.h"
#include "BKE_main.h"
#include "BKE_modifier.h" #include "BKE_modifier.h"
#include "BKE_object.h" #include "BKE_object.h"
#include "BKE_report.h" #include "BKE_report.h"

View File

@@ -34,11 +34,10 @@
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_paint.h" #include "BKE_paint.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_undo_system.h" #include "BKE_undo_system.h"
#include "ED_paint.h" #include "ED_paint.h"
#include "ED_undo.h"
#include "WM_api.h" #include "WM_api.h"
#include "WM_types.h" #include "WM_types.h"
@@ -155,15 +154,15 @@ void ED_paintcurve_undosys_type(UndoType *ut)
void ED_paintcurve_undo_push_begin(const char *name) void ED_paintcurve_undo_push_begin(const char *name)
{ {
UndoStack *ustack = ED_undo_stack_get();
bContext *C = NULL; /* special case, we never read from this. */ bContext *C = NULL; /* special case, we never read from this. */
wmWindowManager *wm = G.main->wm.first; BKE_undosys_step_push_init_with_type(ustack, C, name, BKE_UNDOSYS_TYPE_PAINTCURVE);
BKE_undosys_step_push_init_with_type(wm->undo_stack, C, name, BKE_UNDOSYS_TYPE_PAINTCURVE);
} }
void ED_paintcurve_undo_push_end(void) void ED_paintcurve_undo_push_end(void)
{ {
wmWindowManager *wm = G.main->wm.first; /* XXX, avoids adding extra arg. */ UndoStack *ustack = ED_undo_stack_get();
BKE_undosys_step_push(wm->undo_stack, NULL, NULL); BKE_undosys_step_push(ustack, NULL, NULL);
} }
/** \} */ /** \} */

View File

@@ -41,12 +41,12 @@
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_image.h" #include "BKE_image.h"
#include "BKE_main.h" #include "BKE_main.h"
#include "BKE_global.h"
#include "BKE_undo_system.h" #include "BKE_undo_system.h"
#include "DEG_depsgraph.h" #include "DEG_depsgraph.h"
#include "ED_paint.h" #include "ED_paint.h"
#include "ED_undo.h"
#include "GPU_draw.h" #include "GPU_draw.h"
@@ -360,15 +360,15 @@ static void image_undo_free_list(ListBase *lb)
void ED_image_undo_push_begin(const char *name) void ED_image_undo_push_begin(const char *name)
{ {
UndoStack *ustack = ED_undo_stack_get();
bContext *C = NULL; /* special case, we never read from this. */ bContext *C = NULL; /* special case, we never read from this. */
wmWindowManager *wm = G.main->wm.first; BKE_undosys_step_push_init_with_type(ustack, C, name, BKE_UNDOSYS_TYPE_IMAGE);
BKE_undosys_step_push_init_with_type(wm->undo_stack, C, name, BKE_UNDOSYS_TYPE_IMAGE);
} }
void ED_image_undo_push_end(void) void ED_image_undo_push_end(void)
{ {
wmWindowManager *wm = G.main->wm.first; /* XXX, avoids adding extra arg. */ UndoStack *ustack = ED_undo_stack_get();
BKE_undosys_step_push(wm->undo_stack, NULL, NULL); BKE_undosys_step_push(ustack, NULL, NULL);
} }
static void image_undo_invalidate(void) static void image_undo_invalidate(void)
@@ -489,8 +489,8 @@ ListBase *ED_image_undosys_step_get_tiles(UndoStep *us_p)
ListBase *ED_image_undo_get_tiles(void) ListBase *ED_image_undo_get_tiles(void)
{ {
wmWindowManager *wm = G.main->wm.first; /* XXX, avoids adding extra arg. */ UndoStack *ustack = ED_undo_stack_get();
UndoStep *us = BKE_undosys_stack_init_or_active_with_type(wm->undo_stack, BKE_UNDOSYS_TYPE_IMAGE); UndoStep *us = BKE_undosys_stack_init_or_active_with_type(ustack, BKE_UNDOSYS_TYPE_IMAGE);
return ED_image_undosys_step_get_tiles(us); return ED_image_undosys_step_get_tiles(us);
} }

View File

@@ -59,11 +59,10 @@
#include "BKE_key.h" #include "BKE_key.h"
#include "BKE_mesh.h" #include "BKE_mesh.h"
#include "BKE_subsurf.h" #include "BKE_subsurf.h"
#include "DEG_depsgraph.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_undo_system.h" #include "BKE_undo_system.h"
#include "DEG_depsgraph.h"
#include "WM_api.h" #include "WM_api.h"
#include "WM_types.h" #include "WM_types.h"
@@ -72,6 +71,7 @@
#include "ED_paint.h" #include "ED_paint.h"
#include "ED_object.h" #include "ED_object.h"
#include "ED_sculpt.h" #include "ED_sculpt.h"
#include "ED_undo.h"
#include "bmesh.h" #include "bmesh.h"
#include "paint_intern.h" #include "paint_intern.h"
@@ -981,9 +981,9 @@ SculptUndoNode *sculpt_undo_push_node(
void sculpt_undo_push_begin(const char *name) void sculpt_undo_push_begin(const char *name)
{ {
UndoStack *ustack = ED_undo_stack_get();
bContext *C = NULL; /* special case, we never read from this. */ bContext *C = NULL; /* special case, we never read from this. */
wmWindowManager *wm = G.main->wm.first; BKE_undosys_step_push_init_with_type(ustack, C, name, BKE_UNDOSYS_TYPE_SCULPT);
BKE_undosys_step_push_init_with_type(wm->undo_stack, C, name, BKE_UNDOSYS_TYPE_SCULPT);
} }
void sculpt_undo_push_end(void) void sculpt_undo_push_end(void)
@@ -1002,8 +1002,8 @@ void sculpt_undo_push_end(void)
BKE_pbvh_node_layer_disp_free(unode->node); BKE_pbvh_node_layer_disp_free(unode->node);
} }
wmWindowManager *wm = G.main->wm.first; /* XXX, avoids adding extra arg. */ UndoStack *ustack = ED_undo_stack_get();
BKE_undosys_step_push(wm->undo_stack, NULL, NULL); BKE_undosys_step_push(ustack, NULL, NULL);
} }
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
@@ -1091,8 +1091,8 @@ static UndoSculpt *sculpt_undosys_step_get_nodes(UndoStep *us_p)
static UndoSculpt *sculpt_undo_get_nodes(void) static UndoSculpt *sculpt_undo_get_nodes(void)
{ {
wmWindowManager *wm = G.main->wm.first; /* XXX, avoids adding extra arg. */ UndoStack *ustack = ED_undo_stack_get();
UndoStep *us = BKE_undosys_stack_init_or_active_with_type(wm->undo_stack, BKE_UNDOSYS_TYPE_SCULPT); UndoStep *us = BKE_undosys_stack_init_or_active_with_type(ustack, BKE_UNDOSYS_TYPE_SCULPT);
return sculpt_undosys_step_get_nodes(us); return sculpt_undosys_step_get_nodes(us);
} }

View File

@@ -49,7 +49,6 @@
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_curve.h" #include "BKE_curve.h"
#include "BKE_fcurve.h" #include "BKE_fcurve.h"
#include "BKE_main.h"
#include "BKE_screen.h" #include "BKE_screen.h"
#include "BKE_unit.h" #include "BKE_unit.h"

View File

@@ -56,7 +56,6 @@
#include "BKE_fcurve.h" #include "BKE_fcurve.h"
#include "BKE_library.h" #include "BKE_library.h"
#include "BKE_key.h" #include "BKE_key.h"
#include "BKE_main.h"
#include "BKE_nla.h" #include "BKE_nla.h"
#include "BKE_scene.h" #include "BKE_scene.h"
#include "BKE_context.h" #include "BKE_context.h"

View File

@@ -59,7 +59,6 @@
#include "BKE_global.h" #include "BKE_global.h"
#include "BKE_library.h" #include "BKE_library.h"
#include "BKE_key.h" #include "BKE_key.h"
#include "BKE_main.h"
#include "BKE_nla.h" #include "BKE_nla.h"
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_report.h" #include "BKE_report.h"

View File

@@ -38,7 +38,6 @@
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_library.h" #include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h" #include "BKE_report.h"
#include "BKE_text.h" #include "BKE_text.h"
#include "BKE_undo_system.h" #include "BKE_undo_system.h"

View File

@@ -42,6 +42,7 @@
#include "BKE_blender_undo.h" #include "BKE_blender_undo.h"
#include "BKE_context.h" #include "BKE_context.h"
#include "BKE_global.h" #include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_screen.h" #include "BKE_screen.h"
#include "BKE_undo_system.h" #include "BKE_undo_system.h"
@@ -190,6 +191,19 @@ bool ED_undo_is_valid(const bContext *C, const char *undoname)
return BKE_undosys_stack_has_undo(wm->undo_stack, undoname); return BKE_undosys_stack_has_undo(wm->undo_stack, undoname);
} }
/**
* Ideally we wont access the stack directly,
* this is needed for modes which handle undo themselves (bypassing #ED_undo_push).
*
* Using global isn't great, this just avoids doing inline,
* causing 'BKE_global.h' & 'BKE_main.h' includes.
*/
UndoStack *ED_undo_stack_get(void)
{
wmWindowManager *wm = G.main->wm.first;
return wm->undo_stack;
}
/** \} */ /** \} */
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */

View File

@@ -380,13 +380,13 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1);
* *
* \attention Defined in scaling.c * \attention Defined in scaling.c
*/ */
struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy); bool IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
/** /**
* *
* \attention Defined in scaling.c * \attention Defined in scaling.c
*/ */
struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy); bool IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
/** /**
* *
@@ -399,7 +399,7 @@ void IMB_scaleImBuf_threaded(struct ImBuf *ibuf, unsigned int newx, unsigned int
* \attention Defined in writeimage.c * \attention Defined in writeimage.c
*/ */
short IMB_saveiff(struct ImBuf *ibuf, const char *filepath, int flags); short IMB_saveiff(struct ImBuf *ibuf, const char *filepath, int flags);
struct ImBuf *IMB_prepare_write_ImBuf(const bool isfloat, struct ImBuf *ibuf); bool IMB_prepare_write_ImBuf(const bool isfloat, struct ImBuf *ibuf);
/** /**
* *

View File

@@ -1550,12 +1550,17 @@ static void scalefast_Z_ImBuf(ImBuf *ibuf, int newx, int newy)
} }
} }
struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy) /**
* Return true if \a ibuf is modified.
*/
bool IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy)
{ {
if (ibuf == NULL) return (NULL); if (ibuf == NULL) return false;
if (ibuf->rect == NULL && ibuf->rect_float == NULL) return (ibuf); if (ibuf->rect == NULL && ibuf->rect_float == NULL) return false;
if (newx == ibuf->x && newy == ibuf->y) { return ibuf; } if (newx == ibuf->x && newy == ibuf->y) {
return false;
}
/* scaleup / scaledown functions below change ibuf->x and ibuf->y /* scaleup / scaledown functions below change ibuf->x and ibuf->y
* so we first scale the Z-buffer (if any) */ * so we first scale the Z-buffer (if any) */
@@ -1564,7 +1569,7 @@ struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int
/* try to scale common cases in a fast way */ /* try to scale common cases in a fast way */
/* disabled, quality loss is unacceptable, see report #18609 (ton) */ /* disabled, quality loss is unacceptable, see report #18609 (ton) */
if (0 && q_scale_linear_interpolation(ibuf, newx, newy)) { if (0 && q_scale_linear_interpolation(ibuf, newx, newy)) {
return ibuf; return true;
} }
if (newx && (newx < ibuf->x)) scaledownx(ibuf, newx); if (newx && (newx < ibuf->x)) scaledownx(ibuf, newx);
@@ -1572,14 +1577,17 @@ struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int
if (newx && (newx > ibuf->x)) scaleupx(ibuf, newx); if (newx && (newx > ibuf->x)) scaleupx(ibuf, newx);
if (newy && (newy > ibuf->y)) scaleupy(ibuf, newy); if (newy && (newy > ibuf->y)) scaleupy(ibuf, newy);
return(ibuf); return true;
} }
struct imbufRGBA { struct imbufRGBA {
float r, g, b, a; float r, g, b, a;
}; };
struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy) /**
* Return true if \a ibuf is modified.
*/
bool IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy)
{ {
unsigned int *rect, *_newrect, *newrect; unsigned int *rect, *_newrect, *newrect;
struct imbufRGBA *rectf, *_newrectf, *newrectf; struct imbufRGBA *rectf, *_newrectf, *newrectf;
@@ -1590,16 +1598,16 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned
rect = NULL; _newrect = NULL; newrect = NULL; rect = NULL; _newrect = NULL; newrect = NULL;
rectf = NULL; _newrectf = NULL; newrectf = NULL; rectf = NULL; _newrectf = NULL; newrectf = NULL;
if (ibuf == NULL) return(NULL); if (ibuf == NULL) return false;
if (ibuf->rect) do_rect = true; if (ibuf->rect) do_rect = true;
if (ibuf->rect_float) do_float = true; if (ibuf->rect_float) do_float = true;
if (do_rect == false && do_float == false) return(ibuf); if (do_rect == false && do_float == false) return false;
if (newx == ibuf->x && newy == ibuf->y) return(ibuf); if (newx == ibuf->x && newy == ibuf->y) return false;
if (do_rect) { if (do_rect) {
_newrect = MEM_mallocN(newx * newy * sizeof(int), "scalefastimbuf"); _newrect = MEM_mallocN(newx * newy * sizeof(int), "scalefastimbuf");
if (_newrect == NULL) return(ibuf); if (_newrect == NULL) return false;
newrect = _newrect; newrect = _newrect;
} }
@@ -1607,7 +1615,7 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned
_newrectf = MEM_mallocN(newx * newy * sizeof(float) * 4, "scalefastimbuf f"); _newrectf = MEM_mallocN(newx * newy * sizeof(float) * 4, "scalefastimbuf f");
if (_newrectf == NULL) { if (_newrectf == NULL) {
if (_newrect) MEM_freeN(_newrect); if (_newrect) MEM_freeN(_newrect);
return(ibuf); return false;
} }
newrectf = _newrectf; newrectf = _newrectf;
} }
@@ -1654,7 +1662,7 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned
ibuf->x = newx; ibuf->x = newx;
ibuf->y = newy; ibuf->y = newy;
return(ibuf); return true;
} }
/* ******** threaded scaling ******** */ /* ******** threaded scaling ******** */

View File

@@ -46,7 +46,7 @@
#include "IMB_colormanagement.h" #include "IMB_colormanagement.h"
#include "IMB_colormanagement_intern.h" #include "IMB_colormanagement_intern.h"
static ImBuf *prepare_write_imbuf(const ImFileType *type, ImBuf *ibuf) static bool prepare_write_imbuf(const ImFileType *type, ImBuf *ibuf)
{ {
return IMB_prepare_write_ImBuf((type->flag & IM_FTYPE_FLOAT), ibuf); return IMB_prepare_write_ImBuf((type->flag & IM_FTYPE_FLOAT), ibuf);
} }
@@ -64,15 +64,11 @@ short IMB_saveiff(struct ImBuf *ibuf, const char *name, int flags)
for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) { for (type = IMB_FILE_TYPES; type < IMB_FILE_TYPES_LAST; type++) {
if (type->save && type->ftype(type, ibuf)) { if (type->save && type->ftype(type, ibuf)) {
ImBuf *write_ibuf;
short result = false; short result = false;
write_ibuf = prepare_write_imbuf(type, ibuf); prepare_write_imbuf(type, ibuf);
result = type->save(write_ibuf, name, flags); result = type->save(ibuf, name, flags);
if (write_ibuf != ibuf)
IMB_freeImBuf(write_ibuf);
return result; return result;
} }
@@ -83,9 +79,9 @@ short IMB_saveiff(struct ImBuf *ibuf, const char *name, int flags)
return false; return false;
} }
ImBuf *IMB_prepare_write_ImBuf(const bool isfloat, ImBuf *ibuf) bool IMB_prepare_write_ImBuf(const bool isfloat, ImBuf *ibuf)
{ {
ImBuf *write_ibuf = ibuf; bool changed = false;
if (isfloat) { if (isfloat) {
/* pass */ /* pass */
@@ -94,8 +90,11 @@ ImBuf *IMB_prepare_write_ImBuf(const bool isfloat, ImBuf *ibuf)
if (ibuf->rect == NULL && ibuf->rect_float) { if (ibuf->rect == NULL && ibuf->rect_float) {
ibuf->rect_colorspace = colormanage_colorspace_get_roled(COLOR_ROLE_DEFAULT_BYTE); ibuf->rect_colorspace = colormanage_colorspace_get_roled(COLOR_ROLE_DEFAULT_BYTE);
IMB_rect_from_float(ibuf); IMB_rect_from_float(ibuf);
if (ibuf->rect != NULL) {
changed = true;
}
} }
} }
return write_ibuf; return changed;
} }

View File

@@ -146,6 +146,15 @@ PyObject *PyC_Tuple_PackArray_F32(const float *array, uint len)
return tuple; return tuple;
} }
PyObject *PyC_Tuple_PackArray_F64(const double *array, uint len)
{
PyObject *tuple = PyTuple_New(len);
for (uint i = 0; i < len; i++) {
PyTuple_SET_ITEM(tuple, i, PyFloat_FromDouble(array[i]));
}
return tuple;
}
PyObject *PyC_Tuple_PackArray_I32(const int *array, uint len) PyObject *PyC_Tuple_PackArray_I32(const int *array, uint len)
{ {
PyObject *tuple = PyTuple_New(len); PyObject *tuple = PyTuple_New(len);

View File

@@ -51,12 +51,15 @@ int PyC_AsArray(
const PyTypeObject *type, const bool is_double, const char *error_prefix); const PyTypeObject *type, const bool is_double, const char *error_prefix);
PyObject *PyC_Tuple_PackArray_F32(const float *array, uint len); PyObject *PyC_Tuple_PackArray_F32(const float *array, uint len);
PyObject *PyC_Tuple_PackArray_F64(const double *array, uint len);
PyObject *PyC_Tuple_PackArray_I32(const int *array, uint len); PyObject *PyC_Tuple_PackArray_I32(const int *array, uint len);
PyObject *PyC_Tuple_PackArray_I32FromBool(const int *array, uint len); PyObject *PyC_Tuple_PackArray_I32FromBool(const int *array, uint len);
PyObject *PyC_Tuple_PackArray_Bool(const bool *array, uint len); PyObject *PyC_Tuple_PackArray_Bool(const bool *array, uint len);
#define PyC_Tuple_Pack_F32(...) \ #define PyC_Tuple_Pack_F32(...) \
PyC_Tuple_PackArray_F32(((const float []){__VA_ARGS__}), VA_NARGS_COUNT(__VA_ARGS__)) PyC_Tuple_PackArray_F32(((const float []){__VA_ARGS__}), VA_NARGS_COUNT(__VA_ARGS__))
#define PyC_Tuple_Pack_F64(...) \
PyC_Tuple_PackArray_F64(((const double []){__VA_ARGS__}), VA_NARGS_COUNT(__VA_ARGS__))
#define PyC_Tuple_Pack_I32(...) \ #define PyC_Tuple_Pack_I32(...) \
PyC_Tuple_PackArray_I32(((const int []){__VA_ARGS__}), VA_NARGS_COUNT(__VA_ARGS__)) PyC_Tuple_PackArray_I32(((const int []){__VA_ARGS__}), VA_NARGS_COUNT(__VA_ARGS__))
#define PyC_Tuple_Pack_I32FromBool(...) \ #define PyC_Tuple_Pack_I32FromBool(...) \

View File

@@ -1422,8 +1422,8 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
/* prefer not fail silently in case of api errors, maybe disable it later */ /* prefer not fail silently in case of api errors, maybe disable it later */
CLOG_WARN(BPY_LOG_RNA, CLOG_WARN(BPY_LOG_RNA,
"Current value \"%d\" " "current value '%d' "
"matches no enum in '%s', '%s', '%s'\n", "matches no enum in '%s', '%s', '%s'",
val, RNA_struct_identifier(ptr->type), val, RNA_struct_identifier(ptr->type),
ptr_name, RNA_property_identifier(prop)); ptr_name, RNA_property_identifier(prop));
@@ -6609,7 +6609,7 @@ static PyObject *pyrna_srna_ExternalType(StructRNA *srna)
if (bpy_types == NULL) { if (bpy_types == NULL) {
PyErr_Print(); PyErr_Print();
PyErr_Clear(); PyErr_Clear();
CLOG_ERROR(BPY_LOG_RNA, "failed to find 'bpy_types' module\n"); CLOG_ERROR(BPY_LOG_RNA, "failed to find 'bpy_types' module");
return NULL; return NULL;
} }
bpy_types_dict = PyModule_GetDict(bpy_types); /* borrow */ bpy_types_dict = PyModule_GetDict(bpy_types); /* borrow */
@@ -6627,7 +6627,7 @@ static PyObject *pyrna_srna_ExternalType(StructRNA *srna)
PyObject *tp_slots = PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__); PyObject *tp_slots = PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
if (tp_slots == NULL) { if (tp_slots == NULL) {
CLOG_ERROR(BPY_LOG_RNA, "expected class '%s' to have __slots__ defined, see bpy_types.py\n", idname); CLOG_ERROR(BPY_LOG_RNA, "expected class '%s' to have __slots__ defined, see bpy_types.py", idname);
newclass = NULL; newclass = NULL;
} }
else if (PyTuple_GET_SIZE(tp_bases)) { else if (PyTuple_GET_SIZE(tp_bases)) {
@@ -6637,12 +6637,12 @@ static PyObject *pyrna_srna_ExternalType(StructRNA *srna)
char pyob_info[256]; char pyob_info[256];
PyC_ObSpitStr(pyob_info, sizeof(pyob_info), base_compare); PyC_ObSpitStr(pyob_info, sizeof(pyob_info), base_compare);
CLOG_ERROR(BPY_LOG_RNA, CLOG_ERROR(BPY_LOG_RNA,
"incorrect subclassing of SRNA '%s', expected '%s', see bpy_types.py\n", "incorrect subclassing of SRNA '%s', expected '%s', see bpy_types.py",
idname, pyob_info); idname, pyob_info);
newclass = NULL; newclass = NULL;
} }
else { else {
CLOG_INFO(BPY_LOG_RNA, 2, "SRNA sub-classed: '%s'\n", idname); CLOG_INFO(BPY_LOG_RNA, 2, "SRNA sub-classed: '%s'", idname);
} }
} }
} }
@@ -6740,7 +6740,7 @@ static PyObject *pyrna_srna_Subtype(StructRNA *srna)
} }
else { else {
/* this should not happen */ /* this should not happen */
CLOG_ERROR(BPY_LOG_RNA, "error registering '%s'", idname); CLOG_ERROR(BPY_LOG_RNA, "failed to register '%s'", idname);
PyErr_Print(); PyErr_Print();
PyErr_Clear(); PyErr_Clear();
} }
@@ -7613,7 +7613,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
py_class = RNA_struct_py_type_get(ptr->type); py_class = RNA_struct_py_type_get(ptr->type);
/* rare case. can happen when registering subclasses */ /* rare case. can happen when registering subclasses */
if (py_class == NULL) { if (py_class == NULL) {
CLOG_WARN(BPY_LOG_RNA, "unable to get Python class for rna struct '%.200s'\n", RNA_struct_identifier(ptr->type)); CLOG_WARN(BPY_LOG_RNA, "unable to get Python class for rna struct '%.200s'", RNA_struct_identifier(ptr->type));
return -1; return -1;
} }