[libcamera-devel] libcamera: ipu3: Fix compilation issues with gcc5

Message ID 20200803141837.398158-1-jacopo@jmondi.org
State Superseded
Headers show
Series
  • [libcamera-devel] libcamera: ipu3: Fix compilation issues with gcc5
Related show

Commit Message

Jacopo Mondi Aug. 3, 2020, 2:18 p.m. UTC
GCC5 does not provide prototypes for the math library functions in
the std:: namespace.

Remove the namespace specifier to fix build errors reported by
that compiler version.

Fixes: 968ab9bad0ed ("libcamera: ipu3: imgu: Calculate ImgU pipe configuration")
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---

Laurent, can you test with gcc and confirm this fixes the issue ?

---
 src/libcamera/pipeline/ipu3/imgu.cpp | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

--
2.27.0

Comments

Laurent Pinchart Aug. 3, 2020, 2:25 p.m. UTC | #1
Hi Jacopo,

Thank you for the patch.

On Mon, Aug 03, 2020 at 04:18:37PM +0200, Jacopo Mondi wrote:
> GCC5 does not provide prototypes for the math library functions in
> the std:: namespace.
> 
> Remove the namespace specifier to fix build errors reported by
> that compiler version.
> 
> Fixes: 968ab9bad0ed ("libcamera: ipu3: imgu: Calculate ImgU pipe configuration")
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
> 
> Laurent, can you test with gcc and confirm this fixes the issue ?

It does fix the compilation issue, but... see below.

> ---
>  src/libcamera/pipeline/ipu3/imgu.cpp | 14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
> index b7593ceb3672..671a798e69d0 100644
> --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> @@ -94,7 +94,7 @@ float findScaleFactor(float sf, const std::vector<float> &range,
>  	float bestDiff = std::numeric_limits<float>::max();
>  	unsigned int index = 0;
>  	for (unsigned int i = 0; i < range.size(); ++i) {
> -		float diff = std::abs(sf - range[i]);
> +		float diff = abs(sf - range[i]);

The abs() function in the global namespace is, according to
https://en.cppreference.com/w/c/numeric/math/abs,

	int abs( int n );

This will thus cast the argument to int, which is likely not what you
want. You need to use

	float fabsf( float arg );

instead (https://en.cppreference.com/w/c/numeric/math/fabs).

Same below.

The math functions in the std:: namespace don't suffer for this, as
multiple overloads are defined:

int       abs( int n );
long      abs( long n );
long long abs( long long n );

(https://en.cppreference.com/w/cpp/numeric/math/abs)

float       abs( float arg );
double      abs( double arg );
long double abs( long double arg );

(https://en.cppreference.com/w/cpp/numeric/math/fabs)

but they require <cmath>, not <math.h>.

It's up to you, but if you keep using math.h, you need fabsf() when the
argument and result are floats. Similarly, fmod() should become fmodf(),
otherwise you'll cast the argument to double and cast the result back to
float.

>  		if (diff < bestDiff) {
>  			bestDiff = diff;
>  			index = i;
> @@ -112,7 +112,7 @@ bool isSameRatio(const Size &in, const Size &out)
>  	float inRatio = static_cast<float>(in.width) / in.height;
>  	float outRatio = static_cast<float>(out.width) / out.height;
> 
> -	if (std::abs(inRatio - outRatio) > 0.1)
> +	if (abs(inRatio - outRatio) > 0.1)
>  		return false;
> 
>  	return true;
> @@ -136,7 +136,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
>  		while (ifHeight >= minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> 
>  			bdsHeight = ifHeight / bdsSF;
> -			if (std::fmod(bdsHeight, 1.0) == 0) {
> +			if (fmod(bdsHeight, 1.0) == 0) {
>  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> 
>  				if (!(bdsIntHeight % BDS_ALIGN_H)) {
> @@ -152,7 +152,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
>  		while (ifHeight <= iif.height && ifHeight / bdsSF >= minBDSHeight) {
> 
>  			bdsHeight = ifHeight / bdsSF;
> -			if (std::fmod(bdsHeight, 1.0) == 0) {
> +			if (fmod(bdsHeight, 1.0) == 0) {
>  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> 
>  				if (!(bdsIntHeight % BDS_ALIGN_H)) {
> @@ -176,7 +176,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
>  		while (ifHeight > minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> 
>  			bdsHeight = ifHeight / bdsSF;
> -			if (std::fmod(ifHeight, 1.0) == 0 && std::fmod(bdsHeight, 1.0) == 0) {
> +			if (fmod(ifHeight, 1.0) == 0 && fmod(bdsHeight, 1.0) == 0) {
>  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> 
>  				if (!(ifHeight % IF_ALIGN_H) &&
> @@ -199,7 +199,7 @@ void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
>  	while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
>  		float bdsWidth = static_cast<float>(iif.width) / sf;
> 
> -		if (std::fmod(bdsWidth, 1.0) == 0) {
> +		if (fmod(bdsWidth, 1.0) == 0) {
>  			unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
>  			if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
>  				calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);
> @@ -212,7 +212,7 @@ void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
>  	while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
>  		float bdsWidth = static_cast<float>(iif.width) / sf;
> 
> -		if (std::fmod(bdsWidth, 1.0) == 0) {
> +		if (fmod(bdsWidth, 1.0) == 0) {
>  			unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
>  			if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
>  				calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);
Jacopo Mondi Aug. 3, 2020, 2:43 p.m. UTC | #2
Hi Laurent,

On Mon, Aug 03, 2020 at 05:25:47PM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Mon, Aug 03, 2020 at 04:18:37PM +0200, Jacopo Mondi wrote:
> > GCC5 does not provide prototypes for the math library functions in
> > the std:: namespace.
> >
> > Remove the namespace specifier to fix build errors reported by
> > that compiler version.
> >
> > Fixes: 968ab9bad0ed ("libcamera: ipu3: imgu: Calculate ImgU pipe configuration")
> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > ---
> >
> > Laurent, can you test with gcc and confirm this fixes the issue ?
>
> It does fix the compilation issue, but... see below.
>
> > ---
> >  src/libcamera/pipeline/ipu3/imgu.cpp | 14 +++++++-------
> >  1 file changed, 7 insertions(+), 7 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
> > index b7593ceb3672..671a798e69d0 100644
> > --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> > +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> > @@ -94,7 +94,7 @@ float findScaleFactor(float sf, const std::vector<float> &range,
> >  	float bestDiff = std::numeric_limits<float>::max();
> >  	unsigned int index = 0;
> >  	for (unsigned int i = 0; i < range.size(); ++i) {
> > -		float diff = std::abs(sf - range[i]);
> > +		float diff = abs(sf - range[i]);
>
> The abs() function in the global namespace is, according to
> https://en.cppreference.com/w/c/numeric/math/abs,
>
> 	int abs( int n );
>
> This will thus cast the argument to int, which is likely not what you
> want. You need to use
>
> 	float fabsf( float arg );
>
> instead (https://en.cppreference.com/w/c/numeric/math/fabs).
>
> Same below.
>
> The math functions in the std:: namespace don't suffer for this, as
> multiple overloads are defined:
>
> int       abs( int n );
> long      abs( long n );
> long long abs( long long n );
>
> (https://en.cppreference.com/w/cpp/numeric/math/abs)
>
> float       abs( float arg );
> double      abs( double arg );
> long double abs( long double arg );
>
> (https://en.cppreference.com/w/cpp/numeric/math/fabs)
>
> but they require <cmath>, not <math.h>.
>
> It's up to you, but if you keep using math.h, you need fabsf() when the
> argument and result are floats. Similarly, fmod() should become fmodf(),
> otherwise you'll cast the argument to double and cast the result back to
> float.

We had a rule, to use <foo.h> and not <cfoo>

All the rest of the code uses <math.h> but I don't want to try&shoot
and introduce implicit casting errors in this rather fragile code.

With an ack, I'll use for this module <cmath>, contrary to the rest of
the codebase.

>
> >  		if (diff < bestDiff) {
> >  			bestDiff = diff;
> >  			index = i;
> > @@ -112,7 +112,7 @@ bool isSameRatio(const Size &in, const Size &out)
> >  	float inRatio = static_cast<float>(in.width) / in.height;
> >  	float outRatio = static_cast<float>(out.width) / out.height;
> >
> > -	if (std::abs(inRatio - outRatio) > 0.1)
> > +	if (abs(inRatio - outRatio) > 0.1)
> >  		return false;
> >
> >  	return true;
> > @@ -136,7 +136,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> >  		while (ifHeight >= minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> >
> >  			bdsHeight = ifHeight / bdsSF;
> > -			if (std::fmod(bdsHeight, 1.0) == 0) {
> > +			if (fmod(bdsHeight, 1.0) == 0) {
> >  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> >
> >  				if (!(bdsIntHeight % BDS_ALIGN_H)) {
> > @@ -152,7 +152,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> >  		while (ifHeight <= iif.height && ifHeight / bdsSF >= minBDSHeight) {
> >
> >  			bdsHeight = ifHeight / bdsSF;
> > -			if (std::fmod(bdsHeight, 1.0) == 0) {
> > +			if (fmod(bdsHeight, 1.0) == 0) {
> >  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> >
> >  				if (!(bdsIntHeight % BDS_ALIGN_H)) {
> > @@ -176,7 +176,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> >  		while (ifHeight > minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> >
> >  			bdsHeight = ifHeight / bdsSF;
> > -			if (std::fmod(ifHeight, 1.0) == 0 && std::fmod(bdsHeight, 1.0) == 0) {
> > +			if (fmod(ifHeight, 1.0) == 0 && fmod(bdsHeight, 1.0) == 0) {
> >  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> >
> >  				if (!(ifHeight % IF_ALIGN_H) &&
> > @@ -199,7 +199,7 @@ void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
> >  	while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
> >  		float bdsWidth = static_cast<float>(iif.width) / sf;
> >
> > -		if (std::fmod(bdsWidth, 1.0) == 0) {
> > +		if (fmod(bdsWidth, 1.0) == 0) {
> >  			unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
> >  			if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
> >  				calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);
> > @@ -212,7 +212,7 @@ void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
> >  	while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
> >  		float bdsWidth = static_cast<float>(iif.width) / sf;
> >
> > -		if (std::fmod(bdsWidth, 1.0) == 0) {
> > +		if (fmod(bdsWidth, 1.0) == 0) {
> >  			unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
> >  			if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
> >  				calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);
>
> --
> Regards,
>
> Laurent Pinchart
Laurent Pinchart Aug. 3, 2020, 2:47 p.m. UTC | #3
Hi Jacopo,

On Mon, Aug 03, 2020 at 04:43:26PM +0200, Jacopo Mondi wrote:
> On Mon, Aug 03, 2020 at 05:25:47PM +0300, Laurent Pinchart wrote:
> > On Mon, Aug 03, 2020 at 04:18:37PM +0200, Jacopo Mondi wrote:
> > > GCC5 does not provide prototypes for the math library functions in
> > > the std:: namespace.
> > >
> > > Remove the namespace specifier to fix build errors reported by
> > > that compiler version.
> > >
> > > Fixes: 968ab9bad0ed ("libcamera: ipu3: imgu: Calculate ImgU pipe configuration")
> > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > > ---
> > >
> > > Laurent, can you test with gcc and confirm this fixes the issue ?
> >
> > It does fix the compilation issue, but... see below.
> >
> > > ---
> > >  src/libcamera/pipeline/ipu3/imgu.cpp | 14 +++++++-------
> > >  1 file changed, 7 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
> > > index b7593ceb3672..671a798e69d0 100644
> > > --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> > > +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> > > @@ -94,7 +94,7 @@ float findScaleFactor(float sf, const std::vector<float> &range,
> > >  	float bestDiff = std::numeric_limits<float>::max();
> > >  	unsigned int index = 0;
> > >  	for (unsigned int i = 0; i < range.size(); ++i) {
> > > -		float diff = std::abs(sf - range[i]);
> > > +		float diff = abs(sf - range[i]);
> >
> > The abs() function in the global namespace is, according to
> > https://en.cppreference.com/w/c/numeric/math/abs,
> >
> > 	int abs( int n );
> >
> > This will thus cast the argument to int, which is likely not what you
> > want. You need to use
> >
> > 	float fabsf( float arg );
> >
> > instead (https://en.cppreference.com/w/c/numeric/math/fabs).
> >
> > Same below.
> >
> > The math functions in the std:: namespace don't suffer for this, as
> > multiple overloads are defined:
> >
> > int       abs( int n );
> > long      abs( long n );
> > long long abs( long long n );
> >
> > (https://en.cppreference.com/w/cpp/numeric/math/abs)
> >
> > float       abs( float arg );
> > double      abs( double arg );
> > long double abs( long double arg );
> >
> > (https://en.cppreference.com/w/cpp/numeric/math/fabs)
> >
> > but they require <cmath>, not <math.h>.
> >
> > It's up to you, but if you keep using math.h, you need fabsf() when the
> > argument and result are floats. Similarly, fmod() should become fmodf(),
> > otherwise you'll cast the argument to double and cast the result back to
> > float.
> 
> We had a rule, to use <foo.h> and not <cfoo>
> 
> All the rest of the code uses <math.h> but I don't want to try&shoot
> and introduce implicit casting errors in this rather fragile code.
> 
> With an ack, I'll use for this module <cmath>, contrary to the rest of
> the codebase.

Ack on either option, as I said, pick the one you like best :-)

> > >  		if (diff < bestDiff) {
> > >  			bestDiff = diff;
> > >  			index = i;
> > > @@ -112,7 +112,7 @@ bool isSameRatio(const Size &in, const Size &out)
> > >  	float inRatio = static_cast<float>(in.width) / in.height;
> > >  	float outRatio = static_cast<float>(out.width) / out.height;
> > >
> > > -	if (std::abs(inRatio - outRatio) > 0.1)
> > > +	if (abs(inRatio - outRatio) > 0.1)
> > >  		return false;
> > >
> > >  	return true;
> > > @@ -136,7 +136,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> > >  		while (ifHeight >= minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> > >
> > >  			bdsHeight = ifHeight / bdsSF;
> > > -			if (std::fmod(bdsHeight, 1.0) == 0) {
> > > +			if (fmod(bdsHeight, 1.0) == 0) {
> > >  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> > >
> > >  				if (!(bdsIntHeight % BDS_ALIGN_H)) {
> > > @@ -152,7 +152,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> > >  		while (ifHeight <= iif.height && ifHeight / bdsSF >= minBDSHeight) {
> > >
> > >  			bdsHeight = ifHeight / bdsSF;
> > > -			if (std::fmod(bdsHeight, 1.0) == 0) {
> > > +			if (fmod(bdsHeight, 1.0) == 0) {
> > >  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> > >
> > >  				if (!(bdsIntHeight % BDS_ALIGN_H)) {
> > > @@ -176,7 +176,7 @@ void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
> > >  		while (ifHeight > minIFHeight && ifHeight / bdsSF >= minBDSHeight) {
> > >
> > >  			bdsHeight = ifHeight / bdsSF;
> > > -			if (std::fmod(ifHeight, 1.0) == 0 && std::fmod(bdsHeight, 1.0) == 0) {
> > > +			if (fmod(ifHeight, 1.0) == 0 && fmod(bdsHeight, 1.0) == 0) {
> > >  				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);
> > >
> > >  				if (!(ifHeight % IF_ALIGN_H) &&
> > > @@ -199,7 +199,7 @@ void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
> > >  	while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
> > >  		float bdsWidth = static_cast<float>(iif.width) / sf;
> > >
> > > -		if (std::fmod(bdsWidth, 1.0) == 0) {
> > > +		if (fmod(bdsWidth, 1.0) == 0) {
> > >  			unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
> > >  			if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
> > >  				calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);
> > > @@ -212,7 +212,7 @@ void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
> > >  	while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
> > >  		float bdsWidth = static_cast<float>(iif.width) / sf;
> > >
> > > -		if (std::fmod(bdsWidth, 1.0) == 0) {
> > > +		if (fmod(bdsWidth, 1.0) == 0) {
> > >  			unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
> > >  			if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
> > >  				calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);

Patch

diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
index b7593ceb3672..671a798e69d0 100644
--- a/src/libcamera/pipeline/ipu3/imgu.cpp
+++ b/src/libcamera/pipeline/ipu3/imgu.cpp
@@ -94,7 +94,7 @@  float findScaleFactor(float sf, const std::vector<float> &range,
 	float bestDiff = std::numeric_limits<float>::max();
 	unsigned int index = 0;
 	for (unsigned int i = 0; i < range.size(); ++i) {
-		float diff = std::abs(sf - range[i]);
+		float diff = abs(sf - range[i]);
 		if (diff < bestDiff) {
 			bestDiff = diff;
 			index = i;
@@ -112,7 +112,7 @@  bool isSameRatio(const Size &in, const Size &out)
 	float inRatio = static_cast<float>(in.width) / in.height;
 	float outRatio = static_cast<float>(out.width) / out.height;

-	if (std::abs(inRatio - outRatio) > 0.1)
+	if (abs(inRatio - outRatio) > 0.1)
 		return false;

 	return true;
@@ -136,7 +136,7 @@  void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
 		while (ifHeight >= minIFHeight && ifHeight / bdsSF >= minBDSHeight) {

 			bdsHeight = ifHeight / bdsSF;
-			if (std::fmod(bdsHeight, 1.0) == 0) {
+			if (fmod(bdsHeight, 1.0) == 0) {
 				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);

 				if (!(bdsIntHeight % BDS_ALIGN_H)) {
@@ -152,7 +152,7 @@  void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
 		while (ifHeight <= iif.height && ifHeight / bdsSF >= minBDSHeight) {

 			bdsHeight = ifHeight / bdsSF;
-			if (std::fmod(bdsHeight, 1.0) == 0) {
+			if (fmod(bdsHeight, 1.0) == 0) {
 				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);

 				if (!(bdsIntHeight % BDS_ALIGN_H)) {
@@ -176,7 +176,7 @@  void calculateBDSHeight(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc
 		while (ifHeight > minIFHeight && ifHeight / bdsSF >= minBDSHeight) {

 			bdsHeight = ifHeight / bdsSF;
-			if (std::fmod(ifHeight, 1.0) == 0 && std::fmod(bdsHeight, 1.0) == 0) {
+			if (fmod(ifHeight, 1.0) == 0 && fmod(bdsHeight, 1.0) == 0) {
 				unsigned int bdsIntHeight = static_cast<unsigned int>(bdsHeight);

 				if (!(ifHeight % IF_ALIGN_H) &&
@@ -199,7 +199,7 @@  void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
 	while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
 		float bdsWidth = static_cast<float>(iif.width) / sf;

-		if (std::fmod(bdsWidth, 1.0) == 0) {
+		if (fmod(bdsWidth, 1.0) == 0) {
 			unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
 			if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
 				calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);
@@ -212,7 +212,7 @@  void calculateBDS(ImgUDevice::Pipe *pipe, const Size &iif, const Size &gdc, floa
 	while (sf <= BDS_SF_MAX && sf >= BDS_SF_MIN) {
 		float bdsWidth = static_cast<float>(iif.width) / sf;

-		if (std::fmod(bdsWidth, 1.0) == 0) {
+		if (fmod(bdsWidth, 1.0) == 0) {
 			unsigned int bdsIntWidth = static_cast<unsigned int>(bdsWidth);
 			if (!(bdsIntWidth % BDS_ALIGN_W) && bdsWidth >= minBDSWidth)
 				calculateBDSHeight(pipe, iif, gdc, bdsIntWidth, sf);