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:
Sergey Sharybin 2015-05-19 21:03:24 +05:00
parent 83c9109926
commit e3e23f7746
7 changed files with 94 additions and 44 deletions

View File

@ -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__ */

View File

@ -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

View File

@ -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}")

View File

@ -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__ */

View File

@ -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

View File

@ -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 {

View File

@ -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__ */