ImBuf: Make luminance calculation inlined
Title actually tells it all, it is rather simple function which totally makes sense to be inlined. This gives up to 5% of speedup when updating scopes for a large image. Reviewers: campbellbarton Differential Revision: https://developer.blender.org/D1310
This commit is contained in:
parent
83c9109926
commit
e3e23f7746
|
@ -49,4 +49,16 @@ extern "C++" {
|
|||
}
|
||||
#endif
|
||||
|
||||
/* little macro so inline keyword works */
|
||||
#if defined(_MSC_VER)
|
||||
# define BLI_INLINE static __forceinline
|
||||
#else
|
||||
# if (defined(__APPLE__) && defined(__ppc__))
|
||||
/* static inline __attribute__ here breaks osx ppc gcc42 build */
|
||||
# define BLI_INLINE static __attribute__((always_inline)) __attribute__((__unused__))
|
||||
# else
|
||||
# define BLI_INLINE static inline __attribute__((always_inline)) __attribute__((__unused__))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* __BLI_COMPILER_COMPAT_H__ */
|
||||
|
|
|
@ -628,18 +628,6 @@ extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size);
|
|||
# define UNUSED_VARS_NDEBUG UNUSED_VARS
|
||||
#endif
|
||||
|
||||
/*little macro so inline keyword works*/
|
||||
#if defined(_MSC_VER)
|
||||
# define BLI_INLINE static __forceinline
|
||||
#else
|
||||
# if (defined(__APPLE__) && defined(__ppc__))
|
||||
/* static inline __attribute__ here breaks osx ppc gcc42 build */
|
||||
# define BLI_INLINE static __attribute__((always_inline)) __attribute__((__unused__))
|
||||
# else
|
||||
# define BLI_INLINE static inline __attribute__((always_inline)) __attribute__((__unused__))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* BLI_assert(), default only to print
|
||||
* for aborting need to define WITH_ASSERT_ABORT
|
||||
|
|
|
@ -46,6 +46,7 @@ set(SRC
|
|||
intern/bmp.c
|
||||
intern/cache.c
|
||||
intern/colormanagement.c
|
||||
intern/colormanagement_inline.c
|
||||
intern/divers.c
|
||||
intern/filetype.c
|
||||
intern/filter.c
|
||||
|
@ -187,4 +188,10 @@ if(WIN32)
|
|||
)
|
||||
endif()
|
||||
|
||||
# no need to compile object files for inline headers.
|
||||
set_source_files_properties(
|
||||
intern/colormanagement_inline.c
|
||||
PROPERTIES HEADER_FILE_ONLY TRUE
|
||||
)
|
||||
|
||||
blender_add_lib(bf_imbuf "${SRC}" "${INC}" "${INC_SYS}")
|
||||
|
|
|
@ -36,9 +36,11 @@
|
|||
*/
|
||||
|
||||
#include "BLI_sys_types.h"
|
||||
#include "BLI_compiler_compat.h"
|
||||
|
||||
#define BCM_CONFIG_FILE "config.ocio"
|
||||
|
||||
|
||||
struct bContext;
|
||||
struct ColorManagedColorspaceSettings;
|
||||
struct ColorManagedDisplaySettings;
|
||||
|
@ -67,8 +69,8 @@ void IMB_colormanagement_assign_rect_colorspace(struct ImBuf *ibuf, const char *
|
|||
const char *IMB_colormanagement_get_float_colorspace(struct ImBuf *ibuf);
|
||||
const char *IMB_colormanagement_get_rect_colorspace(struct ImBuf *ibuf);
|
||||
|
||||
float IMB_colormanagement_get_luminance(const float rgb[3]);
|
||||
unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char[3]);
|
||||
BLI_INLINE float IMB_colormanagement_get_luminance(const float rgb[3]);
|
||||
BLI_INLINE unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char[3]);
|
||||
|
||||
/* ** Color space transformation functions ** */
|
||||
void IMB_colormanagement_transform(float *buffer, int width, int height, int channels,
|
||||
|
@ -206,4 +208,6 @@ enum {
|
|||
COLOR_ROLE_DEFAULT_FLOAT,
|
||||
};
|
||||
|
||||
#include "intern/colormanagement_inline.c"
|
||||
|
||||
#endif /* __IMB_COLORMANAGEMENT_H__ */
|
||||
|
|
|
@ -41,6 +41,8 @@
|
|||
struct OCIO_ConstProcessorRcPtr;
|
||||
struct ImBuf;
|
||||
|
||||
extern float imbuf_luma_coefficients[3];
|
||||
|
||||
#define MAX_COLORSPACE_NAME 64
|
||||
#define MAX_COLORSPACE_DESCRIPTION 512
|
||||
|
||||
|
|
|
@ -93,7 +93,7 @@ static int global_tot_looks = 0;
|
|||
/* Set to ITU-BT.709 / sRGB primaries weight. Brute force stupid, but only
|
||||
* option with no colormanagement in place.
|
||||
*/
|
||||
static float luma_coefficients[3] = { 0.2126f, 0.7152f, 0.0722f };
|
||||
float imbuf_luma_coefficients[3] = { 0.2126f, 0.7152f, 0.0722f };
|
||||
|
||||
/* lock used by pre-cached processors getters, so processor wouldn't
|
||||
* be created several times
|
||||
|
@ -552,7 +552,7 @@ static void colormanage_load_config(OCIO_ConstConfigRcPtr *config)
|
|||
}
|
||||
|
||||
/* Load luminance coefficients. */
|
||||
OCIO_configGetDefaultLumaCoefs(config, luma_coefficients);
|
||||
OCIO_configGetDefaultLumaCoefs(config, imbuf_luma_coefficients);
|
||||
}
|
||||
|
||||
static void colormanage_free_config(void)
|
||||
|
@ -1230,34 +1230,6 @@ const char *IMB_colormanagement_get_rect_colorspace(ImBuf *ibuf)
|
|||
return ibuf->rect_colorspace->name;
|
||||
}
|
||||
|
||||
/* Convert a float RGB triplet to the correct luminance weighted average.
|
||||
*
|
||||
* Grayscale, or Luma is a distillation of RGB data values down to a weighted average
|
||||
* based on the luminance positions of the red, green, and blue primaries.
|
||||
* Given that the internal reference space may be arbitrarily set, any
|
||||
* effort to glean the luminance coefficients must be aware of the reference
|
||||
* space primaries.
|
||||
*
|
||||
* See http://wiki.blender.org/index.php/User:Nazg-gul/ColorManagement#Luminance
|
||||
*/
|
||||
|
||||
float IMB_colormanagement_get_luminance(const float rgb[3])
|
||||
{
|
||||
return dot_v3v3(luma_coefficients, rgb);
|
||||
}
|
||||
|
||||
/* Byte equivalent of IMB_colormanagement_get_luminance(). */
|
||||
unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char rgb[3])
|
||||
{
|
||||
float rgbf[3];
|
||||
float val;
|
||||
|
||||
rgb_uchar_to_float(rgbf, rgb);
|
||||
val = dot_v3v3(luma_coefficients, rgbf);
|
||||
|
||||
return FTOCHAR(val);
|
||||
}
|
||||
|
||||
/*********************** Threaded display buffer transform routines *************************/
|
||||
|
||||
typedef struct DisplayBufferThread {
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2015 by Blender Foundation.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Contributor(s): Sergey Sharybin
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/colormanagement_inline.c
|
||||
* \ingroup imbuf
|
||||
*/
|
||||
|
||||
#ifndef __IMB_COLORMANAGEMENT_INLINE_C__
|
||||
#define __IMB_COLORMANAGEMENT_INLINE_C__
|
||||
|
||||
#include "IMB_colormanagement_intern.h"
|
||||
#include "BLI_math_vector.h"
|
||||
|
||||
/* Convert a float RGB triplet to the correct luminance weighted average.
|
||||
*
|
||||
* Grayscale, or Luma is a distillation of RGB data values down to a weighted average
|
||||
* based on the luminance positions of the red, green, and blue primaries.
|
||||
* Given that the internal reference space may be arbitrarily set, any
|
||||
* effort to glean the luminance coefficients must be aware of the reference
|
||||
* space primaries.
|
||||
*
|
||||
* See http://wiki.blender.org/index.php/User:Nazg-gul/ColorManagement#Luminance
|
||||
*/
|
||||
|
||||
float IMB_colormanagement_get_luminance(const float rgb[3])
|
||||
{
|
||||
return dot_v3v3(imbuf_luma_coefficients, rgb);
|
||||
}
|
||||
|
||||
/* Byte equivalent of IMB_colormanagement_get_luminance(). */
|
||||
unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char rgb[3])
|
||||
{
|
||||
float rgbf[3];
|
||||
float val;
|
||||
|
||||
rgb_uchar_to_float(rgbf, rgb);
|
||||
val = dot_v3v3(imbuf_luma_coefficients, rgbf);
|
||||
|
||||
return FTOCHAR(val);
|
||||
}
|
||||
|
||||
#endif /* __IMB_COLORMANAGEMENT_INLINE_H__ */
|
Loading…
Reference in New Issue