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/inc/ResampleKernel.hxx | |
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/inc/ResampleKernel.hxx')
-rw-r--r-- | vcl/inc/ResampleKernel.hxx | 131 |
1 files changed, 131 insertions, 0 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: */ |