@ -311,12 +311,15 @@ FloatBitMap_t *FloatBitMap_t::QuarterSize(void) const
@@ -311,12 +311,15 @@ FloatBitMap_t *FloatBitMap_t::QuarterSize(void) const
FloatBitMap_t * newbm = new FloatBitMap_t ( Width / 2 , Height / 2 ) ;
for ( int y = 0 ; y < Height / 2 ; y + + )
{
for ( int x = 0 ; x < Width / 2 ; x + + )
{
for ( int c = 0 ; c < 4 ; c + + )
newbm - > Pixel ( x , y , c ) = ( ( Pixel ( x * 2 , y * 2 , c ) + Pixel ( x * 2 + 1 , y * 2 , c ) +
Pixel ( x * 2 , y * 2 + 1 , c ) + Pixel ( x * 2 + 1 , y * 2 + 1 , c ) ) / 4 ) ;
}
}
return newbm ;
}
@ -326,11 +329,13 @@ FloatBitMap_t *FloatBitMap_t::QuarterSizeBlocky(void) const
@@ -326,11 +329,13 @@ FloatBitMap_t *FloatBitMap_t::QuarterSizeBlocky(void) const
FloatBitMap_t * newbm = new FloatBitMap_t ( Width / 2 , Height / 2 ) ;
for ( int y = 0 ; y < Height / 2 ; y + + )
{
for ( int x = 0 ; x < Width / 2 ; x + + )
{
for ( int c = 0 ; c < 4 ; c + + )
newbm - > Pixel ( x , y , c ) = Pixel ( x * 2 , y * 2 , c ) ;
}
}
return newbm ;
}
@ -349,11 +354,14 @@ float FloatBitMap_t::BrightestColor(void)
@@ -349,11 +354,14 @@ float FloatBitMap_t::BrightestColor(void)
{
float ret = 0.0 ;
for ( int y = 0 ; y < Height ; y + + )
{
for ( int x = 0 ; x < Width ; x + + )
{
Vector v ( Pixel ( x , y , 0 ) , Pixel ( x , y , 1 ) , Pixel ( x , y , 2 ) ) ;
ret = max ( ret , v . Length ( ) ) ;
}
}
return ret ;
}
@ -394,6 +402,7 @@ void FloatBitMap_t::UnLogize(void)
@@ -394,6 +402,7 @@ void FloatBitMap_t::UnLogize(void)
void FloatBitMap_t : : Clear ( float r , float g , float b , float alpha )
{
for ( int y = 0 ; y < Height ; y + + )
{
for ( int x = 0 ; x < Width ; x + + )
{
Pixel ( x , y , 0 ) = r ;
@ -402,6 +411,7 @@ void FloatBitMap_t::Clear(float r, float g, float b, float alpha)
@@ -402,6 +411,7 @@ void FloatBitMap_t::Clear(float r, float g, float b, float alpha)
Pixel ( x , y , 3 ) = alpha ;
}
}
}
void FloatBitMap_t : : ScaleRGB ( float scale_factor )
{
@ -425,7 +435,9 @@ void FloatBitMap_t::SmartPaste(FloatBitMap_t const &b, int xofs, int yofs, uint3
@@ -425,7 +435,9 @@ void FloatBitMap_t::SmartPaste(FloatBitMap_t const &b, int xofs, int yofs, uint3
FloatBitMap_t DiffMap3 ( this ) ;
FloatBitMap_t * deltas [ 4 ] = { & DiffMap0 , & DiffMap1 , & DiffMap2 , & DiffMap3 } ;
for ( int x = 0 ; x < Width ; x + + )
{
for ( int y = 0 ; y < Height ; y + + )
{
for ( int c = 0 ; c < 3 ; c + + )
{
for ( int i = 0 ; i < NDELTAS ; i + + )
@ -440,8 +452,13 @@ void FloatBitMap_t::SmartPaste(FloatBitMap_t const &b, int xofs, int yofs, uint3
@@ -440,8 +452,13 @@ void FloatBitMap_t::SmartPaste(FloatBitMap_t const &b, int xofs, int yofs, uint3
deltas [ i ] - > Pixel ( x , y , c ) = dx1 ;
}
}
}
}
for ( int x = 1 ; x < b . Width - 1 ; x + + )
{
for ( int y = 1 ; y < b . Height - 1 ; y + + )
{
for ( int c = 0 ; c < 3 ; c + + )
{
for ( int i = 0 ; i < NDELTAS ; i + + )
@ -456,19 +473,21 @@ void FloatBitMap_t::SmartPaste(FloatBitMap_t const &b, int xofs, int yofs, uint3
@@ -456,19 +473,21 @@ void FloatBitMap_t::SmartPaste(FloatBitMap_t const &b, int xofs, int yofs, uint3
}
}
}
}
}
// now, calculate modifiability
for ( int x = 0 ; x < Width ; x + + )
{
for ( int y = 0 ; y < Height ; y + + )
{
float modify = 0 ;
if (
( x > xofs + 1 ) & & ( x < = xofs + b . Width - 2 ) & &
if ( ( x > xofs + 1 ) & & ( x < = xofs + b . Width - 2 ) & &
( y > yofs + 1 ) & & ( y < = yofs + b . Height - 2 ) )
modify = 1 ;
Alpha ( x , y ) = modify ;
}
}
// // now, force a fex pixels in center to be constant
// int midx=xofs+b.Width/2;
// int midy=yofs+b.Height/2;
@ -489,7 +508,8 @@ void FloatBitMap_t::ScaleGradients(void)
@@ -489,7 +508,8 @@ void FloatBitMap_t::ScaleGradients(void)
FloatBitMap_t DiffMap1 ( this ) ;
FloatBitMap_t DiffMap2 ( this ) ;
FloatBitMap_t DiffMap3 ( this ) ;
FloatBitMap_t * deltas [ 4 ] = { & DiffMap0 , & DiffMap1 , & DiffMap2 , & DiffMap3 } ;
FloatBitMap_t * deltas [ 4 ] = { & DiffMap0 , & DiffMap1 , & DiffMap2 , & DiffMap3
} ;
double gsum = 0.0 ;
for ( int x = 0 ; x < Width ; x + + )
for ( int y = 0 ; y < Height ; y + + )
@ -530,8 +550,7 @@ void FloatBitMap_t::ScaleGradients(void)
@@ -530,8 +550,7 @@ void FloatBitMap_t::ScaleGradients(void)
for ( int y = 0 ; y < Height ; y + + )
{
float modify = 0 ;
if (
( x > 0 ) & & ( x < Width - 1 ) & &
if ( ( x > 0 ) & & ( x < Width - 1 ) & &
( y ) & & ( y < Height - 1 ) )
{
modify = 1 ;
@ -553,7 +572,9 @@ void FloatBitMap_t::MakeTileable(void)
@@ -553,7 +572,9 @@ void FloatBitMap_t::MakeTileable(void)
// set each pixel=avg-pixel
FloatBitMap_t * cursrc = & rslta ;
for ( int x = 1 ; x < Width - 1 ; x + + )
{
for ( int y = 1 ; y < Height - 1 ; y + + )
{
for ( int c = 0 ; c < 3 ; c + + )
{
DiffMapX . Pixel ( x , y , c ) = Pixel ( x , y , c ) - Pixel ( x + 1 , y , c ) ;
@ -586,7 +607,9 @@ void FloatBitMap_t::MakeTileable(void)
@@ -586,7 +607,9 @@ void FloatBitMap_t::MakeTileable(void)
{
float error = 0.0 ;
for ( int x = 1 ; x < Width - 1 ; x + + )
{
for ( int y = 1 ; y < Height - 1 ; y + + )
{
for ( int c = 0 ; c < 3 ; c + + )
{
float desiredx = DiffMapX . Pixel ( x , y , c ) + cursrc - > Pixel ( x + 1 , y , c ) ;
@ -597,12 +620,16 @@ void FloatBitMap_t::MakeTileable(void)
@@ -597,12 +620,16 @@ void FloatBitMap_t::MakeTileable(void)
}
SWAP ( cursrc , curdst ) ;
}
}
}
// paste result
for ( int x = 0 ; x < Width ; x + + )
for ( int y = 0 ; y < Height ; y + + )
for ( int c = 0 ; c < 3 ; c + + )
Pixel ( x , y , c ) = curdst - > Pixel ( x , y , c ) ;
}
}
}
void FloatBitMap_t : : GetAlphaBounds ( int & minx , int & miny , int & maxx , int & maxy )
@ -613,15 +640,18 @@ void FloatBitMap_t::GetAlphaBounds(int &minx, int &miny, int &maxx,int &maxy)
@@ -613,15 +640,18 @@ void FloatBitMap_t::GetAlphaBounds(int &minx, int &miny, int &maxx,int &maxy)
for ( y = 0 ; y < Height ; y + + )
if ( Alpha ( minx , y ) )
break ;
if ( y ! = Height )
break ;
}
for ( maxx = Width - 1 ; maxx > = 0 ; maxx - - )
{
int y ;
for ( y = 0 ; y < Height ; y + + )
if ( Alpha ( maxx , y ) )
break ;
if ( y ! = Height )
break ;
}
@ -631,6 +661,7 @@ void FloatBitMap_t::GetAlphaBounds(int &minx, int &miny, int &maxx,int &maxy)
@@ -631,6 +661,7 @@ void FloatBitMap_t::GetAlphaBounds(int &minx, int &miny, int &maxx,int &maxy)
for ( x = minx ; x < = maxx ; x + + )
if ( Alpha ( x , miny ) )
break ;
if ( x < maxx )
break ;
}
@ -640,6 +671,7 @@ void FloatBitMap_t::GetAlphaBounds(int &minx, int &miny, int &maxx,int &maxy)
@@ -640,6 +671,7 @@ void FloatBitMap_t::GetAlphaBounds(int &minx, int &miny, int &maxx,int &maxy)
for ( x = minx ; x < = maxx ; x + + )
if ( Alpha ( x , maxy ) )
break ;
if ( x < maxx )
break ;
}
@ -666,9 +698,13 @@ void FloatBitMap_t::Poisson(FloatBitMap_t *deltas[4],
@@ -666,9 +698,13 @@ void FloatBitMap_t::Poisson(FloatBitMap_t *deltas[4],
tmp - > Poisson ( lowdeltas , n_iters * 4 , flags ) ;
// now, propagate results from tmp to us
for ( int x = 0 ; x < tmp - > Width ; x + + )
{
for ( int y = 0 ; y < tmp - > Height ; y + + )
{
for ( int xi = 0 ; xi < 2 ; xi + + )
{
for ( int yi = 0 ; yi < 2 ; yi + + )
{
if ( Alpha ( x * 2 + xi , y * 2 + yi ) )
{
for ( int c = 0 ; c < 3 ; c + + )
@ -684,6 +720,10 @@ void FloatBitMap_t::Poisson(FloatBitMap_t *deltas[4],
@@ -684,6 +720,10 @@ void FloatBitMap_t::Poisson(FloatBitMap_t *deltas[4],
for ( int i = 0 ; i < NDELTAS ; i + + )
delete lowdeltas [ i ] ;
}
}
}
}
}
FloatBitMap_t work1 ( this ) ;
FloatBitMap_t work2 ( this ) ;
FloatBitMap_t * curdst = & work1 ;