1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

Integration of OCCT 6.5.0 from SVN

This commit is contained in:
bugmaster
2011-03-16 07:30:28 +00:00
committed by bugmaster
parent 4903637061
commit 7fd59977df
16375 changed files with 3882564 additions and 0 deletions

View File

@@ -0,0 +1,604 @@
#include <Image_BalancedPixelInterpolation.ixx>
Image_BalancedPixelInterpolation::Image_BalancedPixelInterpolation() {}
Standard_Boolean Image_BalancedPixelInterpolation::Interpolate(
const Handle(Image_Image)& aImage,
const Standard_Real FX, const Standard_Real FY,
const Standard_Integer LowX,
const Standard_Integer LowY,
const Standard_Integer UpX,
const Standard_Integer UpY,
Aspect_Pixel& aPixel ) const
{
if ( aImage->IsKind(STANDARD_TYPE(Image_DIndexedImage))) {
return Interpolate( Handle(Image_DIndexedImage)::DownCast( aImage ),
FX,FY,LowX,LowY,UpX,UpY,(Aspect_IndexPixel &)aPixel ) ;
}
else if ( aImage->IsKind(STANDARD_TYPE(Image_DColorImage))) {
return Interpolate( Handle(Image_DColorImage)::DownCast( aImage ),
FX,FY,LowX,LowY,UpX,UpY,(Aspect_ColorPixel &)aPixel ) ;
}
else {
return Image_PixelInterpolation::Interpolate( aImage,
FX,FY,LowX,LowY,UpX,UpY,aPixel ) ;
}
}
Standard_Boolean Image_BalancedPixelInterpolation::Interpolate(
const Handle(Image_DColorImage)& aImage,
const Standard_Real FX, const Standard_Real FY,
const Standard_Integer LowX,
const Standard_Integer LowY,
const Standard_Integer UpX,
const Standard_Integer UpY,
Aspect_ColorPixel& aPixel ) const
{ Standard_Integer NX = Standard_Integer(FX) ;
Standard_Integer NY = Standard_Integer(FY) ;
Standard_Integer X[4],Y[4], i ;
Standard_Real R[4], G[4], B[4];
Standard_Boolean DoV[4], SamePixels = 1 ;
Standard_Real SR, SG, SB;
if ( FX < 0. ) NX-- ;
if ( FY < 0. ) NY-- ;
if ( NX < ( LowX-1 ) || NX > UpX ||
NY < ( LowY-1 ) || NY > UpY ) {
return Standard_False ;
}
else {
for ( i = 0 ; i < 4 ; i++ ) DoV[i] = 0 ;
// (0,0)
i = 0; X[i] = NX ; Y[i] = NY ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
aImage->Pixel(X[i],Y[i]).Value().
Values( R[i],G[i],B[i],Quantity_TOC_RGB);
DoV[i] = 1 ;
}
else {
return Standard_False ;
}
// (1,0)
i++ ; X[i] = NX+1 ; Y[i] = NY ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
aImage->Pixel(X[i],Y[i]).Value().
Values( R[i],G[i],B[i],Quantity_TOC_RGB);
DoV[i] = 1 ;
}
else {
R[i] = R[0] ; G[i] = G[0] ; B[i] = B[0] ;
}
// (0,1)
i++ ; X[i] = NX ; Y[i] = NY+1 ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
aImage->Pixel(X[i],Y[i]).Value().
Values( R[i],G[i],B[i],Quantity_TOC_RGB);
DoV[i] = 1 ;
}
else {
R[i] = R[0] ; G[i] = G[0] ; B[i] = B[0] ;
}
// (1,1)
i++ ; X[i] = NX+1 ; Y[i] = NY+1 ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
aImage->Pixel(X[i],Y[i]).Value().
Values( R[i],G[i],B[i],Quantity_TOC_RGB);
DoV[i] = 1 ;
}
else {
R[i] = R[0] ; G[i] = G[0] ; B[i] = B[0] ;
}
// Pixel A [0] Pixel B [1]
// Pixel X
// Pixel C [2] Pixel D [3]
Standard_Boolean First ;
Standard_Integer Ref ;
Standard_Real ColDelta,RowDelta, ContribFromAB, ContribFromCD ;
ColDelta = FX - X[0] ;
RowDelta = FY - Y[0] ;
// Red Componant
for ( i = 0 , First = 1, Ref = -1, SamePixels = 1 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( First ) { Ref = i ; First = 0 ; }
else if ( R[i] != R[Ref] ) { SamePixels = 0 ; break ;}
}
}
if ( Ref == -1 ) {
return Standard_False ;
}
else if ( SamePixels ) {
SR = R[Ref] ;
}
else {
ContribFromAB = ColDelta * ( R[1] - R[0] ) + R[0] ;
ContribFromCD = ColDelta * ( R[3] - R[2] ) + R[2] ;
SR = ContribFromAB +
( ContribFromCD - ContribFromAB ) * RowDelta ;
}
// Green Componant
for ( i = 0 , First = 1, Ref = -1, SamePixels = 1 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( First ) { Ref = i ; First = 0 ; }
else if ( G[i] != G[Ref] ) { SamePixels = 0 ; break ;}
}
}
if ( Ref == -1 ) {
return Standard_False ;
}
else if ( SamePixels ) {
SG = G[Ref] ;
}
else {
ContribFromAB = ColDelta * ( G[1] - G[0] ) + G[0] ;
ContribFromCD = ColDelta * ( G[3] - G[2] ) + G[2] ;
SG = ContribFromAB +
( ContribFromCD - ContribFromAB ) * RowDelta ;
}
// Blue Componant
for ( i = 0 , First = 1, Ref = -1, SamePixels = 1 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( First ) { Ref = i ; First = 0 ; }
else if ( B[i] != B[Ref] ) { SamePixels = 0 ; break ;}
}
}
if ( Ref == -1 ) {
return Standard_False ;
}
else if ( SamePixels ) {
SB = B[Ref] ;
}
else {
ContribFromAB = ColDelta * ( B[1] - B[0] ) + B[0] ;
ContribFromCD = ColDelta * ( B[3] - B[2] ) + B[2] ;
SB = ContribFromAB +
( ContribFromCD - ContribFromAB ) * RowDelta ;
}
// Result
aPixel.SetValue( Quantity_Color( SR, SG, SB, Quantity_TOC_RGB ) ) ;
return Standard_True ;
}
}
Standard_Boolean Image_BalancedPixelInterpolation::Interpolate(
const Handle(Image_DIndexedImage)& aImage,
const Standard_Real FX, const Standard_Real FY,
const Standard_Integer LowX,
const Standard_Integer LowY,
const Standard_Integer UpX,
const Standard_Integer UpY,
Aspect_IndexPixel& aPixel ) const
{ Standard_Integer NX = Standard_Integer(FX) ;
Standard_Integer NY = Standard_Integer(FY) ;
Standard_Integer X[4],Y[4] ;
Standard_Integer V[4], i ;
Standard_Boolean DoV[4], SamePixels = 1 ;
Standard_Real SP ;
if ( FX < 0. ) NX-- ;
if ( FY < 0. ) NY-- ;
if ( NX < ( LowX-1 ) || NX > UpX ||
NY < ( LowY-1 ) || NY > UpY ) {
return Standard_False ;
}
else {
for ( i = 0 ; i < 4 ; i++ ) DoV[i] = 0 ;
i = 0;
// (0,0)
i = 0; X[i] = NX ; Y[i] = NY ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
V[i] = aImage->Pixel( X[i],Y[i] ).Value() ; DoV[i] = 1 ;
}
else {
return Standard_False ;
}
// (1,0)
i++ ; X[i] = NX+1 ; Y[i] = NY ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
V[i] = aImage->Pixel( X[i],Y[i] ).Value() ; DoV[i] = 1 ;
}
else {
V[i] = V[0] ;
}
// (0,1)
i++ ; X[i] = NX ; Y[i] = NY+1 ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
V[i] = aImage->Pixel( X[i],Y[i] ).Value() ; DoV[i] = 1 ;
}
else {
V[i] = V[0] ;
}
// (1,1)
i++ ; X[i] = NX+1 ; Y[i] = NY+1 ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
V[i] = aImage->Pixel( X[i],Y[i] ).Value() ; DoV[i] = 1 ;
}
else {
V[i] = V[0] ;
}
// Pixel A [0] Pixel B [1]
// Pixel X
// Pixel C [2] Pixel D [3]
Standard_Boolean First ;
Standard_Integer Ref ;
Standard_Real ColDelta,RowDelta, ContribFromAB, ContribFromCD ;
for ( i = 0 , First = 1, Ref = -1 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( First ) { Ref = i ; First = 0 ; }
else if ( V[i] != V[Ref] ) { SamePixels = 0 ; break ;}
}
}
if ( Ref == -1 ) {
return Standard_False ;
}
else if ( SamePixels ) {
aPixel.SetValue( V[Ref] ) ;
return Standard_True ;
}
else {
ColDelta = FX - X[0] ;
RowDelta = FY - Y[0] ;
ContribFromAB = ColDelta * ( V[1] - V[0] ) + V[0] ;
ContribFromCD = ColDelta * ( V[3] - V[2] ) + V[2] ;
SP = ContribFromAB +
( ContribFromCD - ContribFromAB ) * RowDelta ;
aPixel.SetValue( Standard_Integer(SP+0.5) ) ;
return Standard_True ;
}
}
}
#ifdef OLD
Standard_Boolean Image_BalancedPixelInterpolation::Interpolate(
const Handle(Image_DColorImage)& aImage,
const Standard_Real FX, const Standard_Real FY,
const Standard_Integer LowX,
const Standard_Integer LowY,
const Standard_Integer UpX,
const Standard_Integer UpY,
Aspect_ColorPixel& aPixel ) const
{ Standard_Integer NX = Standard_Integer(FX) ;
Standard_Integer NY = Standard_Integer(FY) ;
Standard_Integer X[4],Y[4], i ;
Standard_Real R[4], G[4], B[4];
Standard_Boolean DoV[4], SamePixels = 1 ;
Standard_Real D[4], SD, SR, SG, SB;
if ( NX < ( LowX-1 ) || NX > UpX ||
NY < ( LowY-1 ) || NY > UpY ) {
return Standard_False ;
}
else {
if ( FX < 0. ) NX-- ;
if ( FY < 0. ) NY-- ;
for ( i = 0 ; i < 4 ; i++ ) DoV[i] = 0 ;
// (0,0)
i = 0; X[i] = NX ; Y[i] = NY ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
aImage->Pixel(X[i],Y[i]).Value().
Values( R[i],G[i],B[i],Quantity_TOC_RGB);
DoV[i] = 1 ;
}
// (1,0)
i++ ; X[i] = NX+1 ; Y[i] = NY ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
aImage->Pixel(X[i],Y[i]).Value().
Values( R[i],G[i],B[i],Quantity_TOC_RGB);
DoV[i] = 1 ;
}
// (0,1)
i++ ; X[i] = NX ; Y[i] = NY+1 ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
aImage->Pixel(X[i],Y[i]).Value().
Values( R[i],G[i],B[i],Quantity_TOC_RGB);
DoV[i] = 1 ;
}
// (1,1)
i++ ; X[i] = NX+1 ; Y[i] = NY+1 ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
aImage->Pixel(X[i],Y[i]).Value().
Values( R[i],G[i],B[i],Quantity_TOC_RGB);
DoV[i] = 1 ;
}
Standard_Boolean First, DIsComputed ;
Standard_Integer Ref ;
SR = SG = SB = SD = 0. ;
DIsComputed = 0 ;
// Red Componant
for ( i = 0 , First = 1, Ref = -1, SamePixels = 1 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( First ) { Ref = i ; First = 0 ; }
else if ( R[i] != R[Ref] ) { SamePixels = 0 ; break ;}
}
}
if ( Ref == -1 ) {
return Standard_False ;
}
else if ( SamePixels ) {
SR = R[Ref] ;
}
else {
for ( i = 0 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
D[i] = Sqrt( (X[i]-FX)*(X[i]-FX) + (Y[i]-FY)*(Y[i]-FY) );
SD += D[i] ;
SR += D[i] * R[i] ;
}
}
DIsComputed = 1 ;
if ( SD != 0. ) SR /= SD ;
else {
return Standard_False ;
}
}
// Green Componant
for ( i = 0 , First = 1, Ref = -1, SamePixels = 1 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( First ) { Ref = i ; First = 0 ; }
else if ( G[i] != G[Ref] ) { SamePixels = 0 ; break ;}
}
}
if ( Ref == -1 ) {
return Standard_False ;
}
else if ( SamePixels ) {
SG = G[Ref] ;
}
else {
for ( i = 0 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( !DIsComputed ) {
D[i] = Sqrt( (X[i]-FX)*(X[i]-FX) + (Y[i]-FY)*(Y[i]-FY) );
SD += D[i] ;
}
SG += D[i] * G[i] ;
}
}
DIsComputed = 1 ;
if ( SD != 0. ) SG /= SD ;
else {
return Standard_False ;
}
}
// Blue Componant
for ( i = 0 , First = 1, Ref = -1, SamePixels = 1 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( First ) { Ref = i ; First = 0 ; }
else if ( B[i] != B[Ref] ) { SamePixels = 0 ; break ;}
}
}
if ( Ref == -1 ) {
return Standard_False ;
}
else if ( SamePixels ) {
SB = B[Ref] ;
}
else {
for ( i = 0 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( !DIsComputed ) {
D[i] = Sqrt( (X[i]-FX)*(X[i]-FX) + (Y[i]-FY)*(Y[i]-FY) );
SD += D[i] ;
}
SB += D[i] * B[i] ;
}
}
DIsComputed = 1 ;
if ( SD != 0. ) SB /= SD ;
else {
return Standard_False ;
}
}
// Result
aPixel.SetValue( Quantity_Color( SR, SG, SB, Quantity_TOC_RGB ) ) ;
return Standard_True ;
}
}
Standard_Boolean Image_BalancedPixelInterpolation::Interpolate(
const Handle(Image_DIndexedImage)& aImage,
const Standard_Real FX, const Standard_Real FY,
const Standard_Integer LowX,
const Standard_Integer LowY,
const Standard_Integer UpX,
const Standard_Integer UpY,
Aspect_IndexPixel& aPixel ) const
{ Standard_Integer NX = Standard_Integer(FX) ;
Standard_Integer NY = Standard_Integer(FY) ;
Standard_Integer X[4],Y[4] ;
Standard_Integer V[4], i ;
Standard_Boolean DoV[4], SamePixels = 1 ;
Standard_Real D, SD, SP ;
if ( NX < ( LowX-1 ) || NX > UpX ||
NY < ( LowY-1 ) || NY > UpY ) {
return Standard_False ;
}
else {
if ( FX < 0. ) NX-- ;
if ( FY < 0. ) NY-- ;
SP = SD = 0. ;
for ( i = 0 ; i < 4 ; i++ ) DoV[i] = 0 ;
i = 0;
// (0,0)
i = 0; X[i] = NX ; Y[i] = NY ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
V[i] = aImage->Pixel( X[i],Y[i] ).Value() ; DoV[i] = 1 ;
}
// (1,0)
i++ ; X[i] = NX+1 ; Y[i] = NY ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
V[i] = aImage->Pixel( X[i],Y[i] ).Value() ; DoV[i] = 1 ;
}
// (0,1)
i++ ; X[i] = NX ; Y[i] = NY+1 ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
V[i] = aImage->Pixel( X[i],Y[i] ).Value() ; DoV[i] = 1 ;
}
// (1,1)
i++ ; X[i] = NX+1 ; Y[i] = NY+1 ;
if ( !( X[i] < LowX || X[i] > UpX ||
Y[i] < LowY || Y[i] > UpY ) ) {
V[i] = aImage->Pixel( X[i],Y[i] ).Value() ; DoV[i] = 1 ;
}
Standard_Boolean First ;
Standard_Integer Ref ;
for ( i = 0 , First = 1, Ref = -1 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
if ( First ) { Ref = i ; First = 0 ; }
else if ( V[i] != V[Ref] ) { SamePixels = 0 ; break ;}
}
}
if ( Ref == -1 ) {
return Standard_False ;
}
else if ( SamePixels ) {
aPixel.SetValue( V[Ref] ) ;
return Standard_True ;
}
else {
for ( i = 0 ; i < 4 ; i++ ) {
if ( DoV[i] ) {
D = Sqrt( (X[i]-FX)*(X[i]-FX) + (Y[i]-FY)*(Y[i]-FY) );
SP += D * V[i] ; SD += D ;
}
}
// Result
if ( SD != 0. ) {
SP /= SD ;
aPixel.SetValue( Standard_Integer(SP+0.5) ) ;
return Standard_True ;
}
else {
return Standard_False ;
}
}
}
}
#endif