From e3e23f774697782424647d8a12792dbc768501ad Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 19 May 2015 21:03:24 +0500 Subject: 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 --- .../imbuf/intern/IMB_colormanagement_intern.h | 2 + source/blender/imbuf/intern/colormanagement.c | 32 +---------- .../blender/imbuf/intern/colormanagement_inline.c | 65 ++++++++++++++++++++++ 3 files changed, 69 insertions(+), 30 deletions(-) create mode 100644 source/blender/imbuf/intern/colormanagement_inline.c (limited to 'source/blender/imbuf/intern') diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.h b/source/blender/imbuf/intern/IMB_colormanagement_intern.h index 710e70937e6..b75f12b239d 100644 --- a/source/blender/imbuf/intern/IMB_colormanagement_intern.h +++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.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 diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index 5a3d9b4c653..e4e93d3c4da 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -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 { diff --git a/source/blender/imbuf/intern/colormanagement_inline.c b/source/blender/imbuf/intern/colormanagement_inline.c new file mode 100644 index 00000000000..8382e2a9bfa --- /dev/null +++ b/source/blender/imbuf/intern/colormanagement_inline.c @@ -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__ */ -- cgit v1.2.3