From 64baed93cfa9b74d6ef5a8913918cfbaf8499271 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Thu, 9 Jul 2015 21:02:48 +0200 Subject: vcl: move resample kernel classes out of bitmap.hxx Since commit f31e6debfa7e330f985a0846a6ca91130d3dab20 this drags in ridiculous amounts of boost headers, for probably negigible improvemnts of sin(x)/x for tiny x values. The compile time impact was not negligible, moving this nonsense to its own header removes 1.79 GB of preprocessor input from a full build. Change-Id: Ic41b2210eac8b130726610f2dbdbb449379225d1 --- include/vcl/bitmap.hxx | 107 ++---------------------------------- vcl/inc/ResampleKernel.hxx | 131 +++++++++++++++++++++++++++++++++++++++++++++ vcl/inc/opengl/salbmp.hxx | 4 +- vcl/opengl/scale.cxx | 8 +++ vcl/source/gdi/bitmap3.cxx | 7 +++ 5 files changed, 153 insertions(+), 104 deletions(-) create mode 100644 vcl/inc/ResampleKernel.hxx diff --git a/include/vcl/bitmap.hxx b/include/vcl/bitmap.hxx index 6cdb3186af38..124ddbedc1cf 100644 --- a/include/vcl/bitmap.hxx +++ b/include/vcl/bitmap.hxx @@ -20,7 +20,6 @@ #ifndef INCLUDED_VCL_BITMAP_HXX #define INCLUDED_VCL_BITMAP_HXX -#include #include #include #include @@ -217,106 +216,6 @@ private: }; -// Resample kernels - -class Kernel -{ - -public: - Kernel () {} - virtual ~Kernel() {} - - virtual double GetWidth() const = 0; - virtual double Calculate( double x ) const = 0; -}; - -class Lanczos3Kernel : public Kernel -{ -public: - Lanczos3Kernel() : Kernel () {} - - virtual double GetWidth() const SAL_OVERRIDE { return 3.0; } - virtual double Calculate (double x) const SAL_OVERRIDE - { - return (-3.0 <= x && x < 3.0) ? SincFilter(x) * SincFilter( x / 3.0 ) : 0.0; - } - - static inline double SincFilter(double x) - { - if (x == 0.0) - { - return 1.0; - } - x = x * M_PI; - return boost::math::sinc_pi(x, SincPolicy()); - } - -private: - typedef boost::math::policies::policy< - boost::math::policies::promote_double > SincPolicy; -}; - -class BicubicKernel : public Kernel -{ -public: - BicubicKernel() : Kernel () {} - -private: - virtual double GetWidth() const SAL_OVERRIDE { return 2.0; } - virtual double Calculate (double x) const SAL_OVERRIDE - { - if (x < 0.0) - { - x = -x; - } - - if (x <= 1.0) - { - return (1.5 * x - 2.5) * x * x + 1.0; - } - else if (x < 2.0) - { - return ((-0.5 * x + 2.5) * x - 4) * x + 2; - } - return 0.0; - } -}; - -class BilinearKernel : public Kernel -{ -public: - BilinearKernel() : Kernel () {} -private: - virtual double GetWidth() const SAL_OVERRIDE { return 1.0; } - virtual double Calculate (double x) const SAL_OVERRIDE - { - if (x < 0.0) - { - x = -x; - } - if (x < 1.0) - { - return 1.0-x; - } - return 0.0; - } -}; - -class BoxKernel : public Kernel -{ -public: - BoxKernel() : Kernel () {} - -private: - virtual double GetWidth() const SAL_OVERRIDE { return 0.5; } - virtual double Calculate (double x) const SAL_OVERRIDE - { - if (-0.5 <= x && x < 0.5) - return 1.0; - return 0.0; - } -}; - class BitmapInfoAccess; class BitmapReadAccess; class BitmapWriteAccess; @@ -328,6 +227,10 @@ class GDIMetaFile; class AlphaMask; class OutputDevice; class SalBitmap; +namespace vcl +{ + class Kernel; +} struct BitmapSystemData { @@ -826,7 +729,7 @@ public: SAL_DLLPRIVATE void ImplAdaptBitCount(Bitmap& rNew) const; SAL_DLLPRIVATE bool ImplScaleFast( const double& rScaleX, const double& rScaleY ); SAL_DLLPRIVATE bool ImplScaleInterpolate( const double& rScaleX, const double& rScaleY ); - SAL_DLLPRIVATE bool ImplScaleConvolution( const double& rScaleX, const double& rScaleY, const Kernel& aKernel); + SAL_DLLPRIVATE bool ImplScaleConvolution( const double& rScaleX, const double& rScaleY, const vcl::Kernel& rKernel); SAL_DLLPRIVATE bool ImplConvolutionPass( Bitmap& aNewBitmap, diff --git a/vcl/inc/ResampleKernel.hxx b/vcl/inc/ResampleKernel.hxx new file mode 100644 index 000000000000..20f0dfa820d5 --- /dev/null +++ b/vcl/inc/ResampleKernel.hxx @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_VCL_RESAMPLEKERNEL_HXX +#define INCLUDED_VCL_RESAMPLEKERNEL_HXX + +#include + +namespace vcl { + +// Resample kernels + +class Kernel +{ +public: + Kernel() {} + virtual ~Kernel() {} + + virtual double GetWidth() const = 0; + virtual double Calculate( double x ) const = 0; +}; + +class Lanczos3Kernel : public Kernel +{ +public: + Lanczos3Kernel() : Kernel () {} + + virtual double GetWidth() const SAL_OVERRIDE { return 3.0; } + virtual double Calculate (double x) const SAL_OVERRIDE + { + return (-3.0 <= x && x < 3.0) ? SincFilter(x) * SincFilter( x / 3.0 ) : 0.0; + } + + static inline double SincFilter(double x) + { + if (x == 0.0) + { + return 1.0; + } + x = x * M_PI; + return boost::math::sinc_pi(x, SincPolicy()); + } + +private: + typedef boost::math::policies::policy< + boost::math::policies::promote_double > SincPolicy; +}; + +class BicubicKernel : public Kernel +{ +public: + BicubicKernel() : Kernel () {} + +private: + virtual double GetWidth() const SAL_OVERRIDE { return 2.0; } + virtual double Calculate (double x) const SAL_OVERRIDE + { + if (x < 0.0) + { + x = -x; + } + + if (x <= 1.0) + { + return (1.5 * x - 2.5) * x * x + 1.0; + } + else if (x < 2.0) + { + return ((-0.5 * x + 2.5) * x - 4) * x + 2; + } + return 0.0; + } +}; + +class BilinearKernel : public Kernel +{ +public: + BilinearKernel() : Kernel () {} + +private: + virtual double GetWidth() const SAL_OVERRIDE { return 1.0; } + virtual double Calculate (double x) const SAL_OVERRIDE + { + if (x < 0.0) + { + x = -x; + } + if (x < 1.0) + { + return 1.0-x; + } + return 0.0; + } +}; + +class BoxKernel : public Kernel +{ +public: + BoxKernel() : Kernel () {} + +private: + virtual double GetWidth() const SAL_OVERRIDE { return 0.5; } + virtual double Calculate (double x) const SAL_OVERRIDE + { + if (-0.5 <= x && x < 0.5) + return 1.0; + return 0.0; + } +}; + +} // namespace vcl + +#endif // INCLUDED_VCL_RESAMPLEKERNEL_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/opengl/salbmp.hxx b/vcl/inc/opengl/salbmp.hxx index ba9ac3f4fe2f..daefbe26b8a2 100644 --- a/vcl/inc/opengl/salbmp.hxx +++ b/vcl/inc/opengl/salbmp.hxx @@ -98,8 +98,8 @@ private: private: bool ImplScaleFilter( const double& rScaleX, const double& rScaleY, GLenum nFilter ); - static void ImplCreateKernel( const double& fScale, const Kernel& rKernel, GLfloat*& pWeights, sal_uInt32& aKernelSize ); - bool ImplScaleConvolution( const double& rScaleX, const double& rScaleY, const Kernel& aKernel ); + static void ImplCreateKernel( const double& fScale, const vcl::Kernel& rKernel, GLfloat*& pWeights, sal_uInt32& aKernelSize ); + bool ImplScaleConvolution(const double& rScaleX, const double& rScaleY, const vcl::Kernel& rKernel); bool ImplScaleArea( double rScaleX, double rScaleY ); public: diff --git a/vcl/opengl/scale.cxx b/vcl/opengl/scale.cxx index 7b8691226e81..22db644c0454 100644 --- a/vcl/opengl/scale.cxx +++ b/vcl/opengl/scale.cxx @@ -28,6 +28,14 @@ #include "opengl/program.hxx" #include "opengl/texture.hxx" +#include + +using vcl::Kernel; +using vcl::Lanczos3Kernel; +using vcl::BicubicKernel; +using vcl::BilinearKernel; +using vcl::BoxKernel; + class ScaleOp : public OpenGLSalBitmapOp { private: diff --git a/vcl/source/gdi/bitmap3.cxx b/vcl/source/gdi/bitmap3.cxx index 130f065b87e5..b2704e15c17a 100644 --- a/vcl/source/gdi/bitmap3.cxx +++ b/vcl/source/gdi/bitmap3.cxx @@ -33,6 +33,13 @@ #include #include "octree.hxx" +#include + +using vcl::Kernel; +using vcl::Lanczos3Kernel; +using vcl::BicubicKernel; +using vcl::BilinearKernel; +using vcl::BoxKernel; #define RGB15( _def_cR, _def_cG, _def_cB ) (((sal_uLong)(_def_cR)<<10UL)|((sal_uLong)(_def_cG)<<5UL)|(sal_uLong)(_def_cB)) #define GAMMA( _def_cVal, _def_InvGamma ) ((sal_uInt8)MinMax(FRound(pow( _def_cVal/255.0,_def_InvGamma)*255.0),0L,255L)) -- cgit