diff options
author | Michael Stahl <mstahl@redhat.com> | 2015-07-09 21:02:48 +0200 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2015-07-10 23:27:39 +0200 |
commit | 64baed93cfa9b74d6ef5a8913918cfbaf8499271 (patch) | |
tree | 5ca005dab162f486ca8e269d363c4afb1e6e8bfb /vcl | |
parent | 7aa9f045387a95d0b1a516f917fbcd23e0578902 (diff) |
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
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/ResampleKernel.hxx | 131 | ||||
-rw-r--r-- | vcl/inc/opengl/salbmp.hxx | 4 | ||||
-rw-r--r-- | vcl/opengl/scale.cxx | 8 | ||||
-rw-r--r-- | vcl/source/gdi/bitmap3.cxx | 7 |
4 files changed, 148 insertions, 2 deletions
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 <boost/math/special_functions/sinc.hpp> + +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<false> > 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 <ResampleKernel.hxx> + +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 <impvect.hxx> #include "octree.hxx" +#include <ResampleKernel.hxx> + +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)) |