diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2018-12-02 16:50:22 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2018-12-03 07:53:30 +0100 |
commit | 644188bf7f3a07222f2b58a3794348197fb8ad24 (patch) | |
tree | ff32e70e51353951e9b7dd07fc26a1d41b258038 /vcl/source/bitmap | |
parent | 1ee8d4f63adf3113a4733a479c8faf9eb65f7b8d (diff) |
Compute (un-)premultiply_table at compile time
Change-Id: I34e624fcd5d11d02c26e775f5acdddec1fca9d87
Reviewed-on: https://gerrit.libreoffice.org/64428
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'vcl/source/bitmap')
-rw-r--r-- | vcl/source/bitmap/BitmapTools.cxx | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx index 4bac9745795e..f9095a86f541 100644 --- a/vcl/source/bitmap/BitmapTools.cxx +++ b/vcl/source/bitmap/BitmapTools.cxx @@ -8,6 +8,11 @@ * */ +#include <sal/config.h> + +#include <array> +#include <utility> + #include <vcl/BitmapTools.hxx> #include <sal/log.hxx> @@ -268,7 +273,7 @@ BitmapEx* CreateFromCairoSurface(Size aSize, cairo_surface_t * pSurface) cairo_surface_flush(pPixels); unsigned char *pSrc = cairo_image_surface_get_data( pPixels ); unsigned int nStride = cairo_image_surface_get_stride( pPixels ); - vcl::bitmap::lookup_table unpremultiply_table = vcl::bitmap::get_unpremultiply_table(); + vcl::bitmap::lookup_table const & unpremultiply_table = vcl::bitmap::get_unpremultiply_table(); for( unsigned long y = 0; y < static_cast<unsigned long>(aSize.Height()); y++ ) { sal_uInt32 *pPix = reinterpret_cast<sal_uInt32 *>(pSrc + nStride * y); @@ -727,7 +732,7 @@ void CanvasCairoExtractBitmapData( BitmapEx const & aBmpEx, Bitmap & aBitmap, un ::Color aColor; unsigned int nAlpha = 255; - vcl::bitmap::lookup_table premultiply_table = vcl::bitmap::get_premultiply_table(); + vcl::bitmap::lookup_table const & premultiply_table = vcl::bitmap::get_premultiply_table(); for( nY = 0; nY < nHeight; nY++ ) { ::Scanline pReadScan; @@ -1046,45 +1051,51 @@ void CanvasCairoExtractBitmapData( BitmapEx const & aBmpEx, Bitmap & aBitmap, un return bRet; } - static sal_uInt8 unpremultiply(sal_uInt8 c, sal_uInt8 a) + static constexpr sal_uInt8 unpremultiply(sal_uInt8 c, sal_uInt8 a) { return (a == 0) ? 0 : (c * 255 + a / 2) / a; } - static sal_uInt8 premultiply(sal_uInt8 c, sal_uInt8 a) + static constexpr sal_uInt8 premultiply(sal_uInt8 c, sal_uInt8 a) { return (c * a + 127) / 255; } - lookup_table get_unpremultiply_table() + template<int... Is> static constexpr std::array<sal_uInt8, 256> make_unpremultiply_table_row_( + int a, std::integer_sequence<int, Is...>) { - static bool inited; - static sal_uInt8 unpremultiply_table[256][256]; + return {unpremultiply(Is, a)...}; + } - if (!inited) - { - for (int a = 0; a < 256; ++a) - for (int c = 0; c < 256; ++c) - unpremultiply_table[a][c] = unpremultiply(c, a); - inited = true; - } + template<int... Is> static constexpr lookup_table make_unpremultiply_table_( + std::integer_sequence<int, Is...>) + { + return {make_unpremultiply_table_row_(Is, std::make_integer_sequence<int, 256>{})...}; + } + lookup_table const & get_unpremultiply_table() + { + static constexpr auto unpremultiply_table = make_unpremultiply_table_( + std::make_integer_sequence<int, 256>{}); return unpremultiply_table; } - lookup_table get_premultiply_table() + template<int... Is> static constexpr std::array<sal_uInt8, 256> make_premultiply_table_row_( + int a, std::integer_sequence<int, Is...>) { - static bool inited; - static sal_uInt8 premultiply_table[256][256]; + return {premultiply(Is, a)...}; + } - if (!inited) - { - for (int a = 0; a < 256; ++a) - for (int c = 0; c < 256; ++c) - premultiply_table[a][c] = premultiply(c, a); - inited = true; - } + template<int... Is> static constexpr lookup_table make_premultiply_table_( + std::integer_sequence<int, Is...>) + { + return {make_premultiply_table_row_(Is, std::make_integer_sequence<int, 256>{})...}; + } + lookup_table const & get_premultiply_table() + { + static constexpr auto premultiply_table = make_premultiply_table_( + std::make_integer_sequence<int, 256>{}); return premultiply_table; } |