Kaydet (Commit) 64baed93 authored tarafından Michael Stahl's avatar Michael Stahl

vcl: move resample kernel classes out of bitmap.hxx

Since commit f31e6deb 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
üst 7aa9f045
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#ifndef INCLUDED_VCL_BITMAP_HXX #ifndef INCLUDED_VCL_BITMAP_HXX
#define INCLUDED_VCL_BITMAP_HXX #define INCLUDED_VCL_BITMAP_HXX
#include <boost/math/special_functions/sinc.hpp>
#include <tools/color.hxx> #include <tools/color.hxx>
#include <tools/link.hxx> #include <tools/link.hxx>
#include <tools/solar.h> #include <tools/solar.h>
...@@ -217,106 +216,6 @@ private: ...@@ -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<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;
}
};
class BitmapInfoAccess; class BitmapInfoAccess;
class BitmapReadAccess; class BitmapReadAccess;
class BitmapWriteAccess; class BitmapWriteAccess;
...@@ -328,6 +227,10 @@ class GDIMetaFile; ...@@ -328,6 +227,10 @@ class GDIMetaFile;
class AlphaMask; class AlphaMask;
class OutputDevice; class OutputDevice;
class SalBitmap; class SalBitmap;
namespace vcl
{
class Kernel;
}
struct BitmapSystemData struct BitmapSystemData
{ {
...@@ -826,7 +729,7 @@ public: ...@@ -826,7 +729,7 @@ public:
SAL_DLLPRIVATE void ImplAdaptBitCount(Bitmap& rNew) const; SAL_DLLPRIVATE void ImplAdaptBitCount(Bitmap& rNew) const;
SAL_DLLPRIVATE bool ImplScaleFast( const double& rScaleX, const double& rScaleY ); SAL_DLLPRIVATE bool ImplScaleFast( const double& rScaleX, const double& rScaleY );
SAL_DLLPRIVATE bool ImplScaleInterpolate( 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( SAL_DLLPRIVATE bool ImplConvolutionPass(
Bitmap& aNewBitmap, Bitmap& aNewBitmap,
......
/* -*- 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: */
...@@ -98,8 +98,8 @@ private: ...@@ -98,8 +98,8 @@ private:
private: private:
bool ImplScaleFilter( const double& rScaleX, const double& rScaleY, GLenum nFilter ); bool ImplScaleFilter( const double& rScaleX, const double& rScaleY, GLenum nFilter );
static void ImplCreateKernel( const double& fScale, const Kernel& rKernel, GLfloat*& pWeights, sal_uInt32& aKernelSize ); static void ImplCreateKernel( const double& fScale, const vcl::Kernel& rKernel, GLfloat*& pWeights, sal_uInt32& aKernelSize );
bool ImplScaleConvolution( const double& rScaleX, const double& rScaleY, const Kernel& aKernel ); bool ImplScaleConvolution(const double& rScaleX, const double& rScaleY, const vcl::Kernel& rKernel);
bool ImplScaleArea( double rScaleX, double rScaleY ); bool ImplScaleArea( double rScaleX, double rScaleY );
public: public:
......
...@@ -28,6 +28,14 @@ ...@@ -28,6 +28,14 @@
#include "opengl/program.hxx" #include "opengl/program.hxx"
#include "opengl/texture.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 class ScaleOp : public OpenGLSalBitmapOp
{ {
private: private:
......
...@@ -33,6 +33,13 @@ ...@@ -33,6 +33,13 @@
#include <impvect.hxx> #include <impvect.hxx>
#include "octree.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 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)) #define GAMMA( _def_cVal, _def_InvGamma ) ((sal_uInt8)MinMax(FRound(pow( _def_cVal/255.0,_def_InvGamma)*255.0),0L,255L))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment