@Override final public int getScaledSum( final int xMin, final int yMin, final int xMax, final int yMax, final float scale ) { final int y1w = yMin * w + w1; final int y2w = yMax * w + w1; return Util.roundPos( ( sum[ y1w + xMin ] + sum[ y2w + xMax ] - sum[ y1w + xMax ] - sum[ y2w + xMin ] ) * scale ); } }
@Override final public int getScaledSum( final int xMin, final int yMin, final int xMax, final int yMax, final float scale ) { final int y1w = yMin * w + w1; final int y2w = yMax * w + w1; return Util.roundPos( ( sum[ y1w + xMin ] + sum[ y2w + xMax ] - sum[ y1w + xMax ] - sum[ y2w + xMin ] ) * scale ); } }
@Override final public int getScaledSum( final int xMin, final int yMin, final int xMax, final int yMax, final float scale ) { final int y1w = yMin * w + w1; final int y2w = yMax * w + w1; return Util.roundPos( ( sum[ y1w + xMin ] + sum[ y2w + xMax ] - sum[ y1w + xMax ] - sum[ y2w + xMin ] ) * scale ); } }
@Override final public int getScaledSum( final int xMin, final int yMin, final int xMax, final int yMax, final float scale ) { final int y1w = yMin * w + w1; final int y2w = yMax * w + w1; return Util.roundPos( ( sum[ y1w + xMin ] + sum[ y2w + xMax ] - sum[ y1w + xMax ] - sum[ y2w + xMin ] ) * scale ); } }
@Override final public int getScaledSum( final int xMin, final int yMin, final int xMax, final int yMax, final float scale ) { final int y1w = yMin * w + w1; final int y2w = yMax * w + w1; final int a = y1w + xMin; final int b = y2w + xMax; final int c = y1w + xMax; final int d = y2w + xMin; final int r = Util.roundPos( ( sumR[ a ] + sumR[ b ] - sumR[ c ] - sumR[ d ] ) * scale ); final int g = Util.roundPos( ( sumG[ a ] + sumG[ b ] - sumG[ c ] - sumG[ d ] ) * scale ); final int x = Util.roundPos( ( sumB[ a ] + sumB[ b ] - sumB[ c ] - sumB[ d ] ) * scale ); return ( ( ( r << 8 ) | g ) << 8 ) | x; } }
@Override final public int getScaledSum( final int xMin, final int yMin, final int xMax, final int yMax, final float scale ) { final int y1w = yMin * w + w1; final int y2w = yMax * w + w1; final int a = y1w + xMin; final int b = y2w + xMax; final int c = y1w + xMax; final int d = y2w + xMin; final int r = Util.roundPos( ( sumR[ a ] + sumR[ b ] - sumR[ c ] - sumR[ d ] ) * scale ); final int g = Util.roundPos( ( sumG[ a ] + sumG[ b ] - sumG[ c ] - sumG[ d ] ) * scale ); final int x = Util.roundPos( ( sumB[ a ] + sumB[ b ] - sumB[ c ] - sumB[ d ] ) * scale ); return ( ( ( r << 8 ) | g ) << 8 ) | x; } }
final static protected int numY( final int numX, final double width, final double height ) { final int numXs = Math.max( 2, numX ); final double dx = width / ( numXs - 1 ); final double dy = 2.0f * Math.sqrt( 3.0f / 4.0f * dx * dx ); return Math.max( 2, Util.roundPos( height / dy ) + 1 ); }
final static protected int numY( final int numX, final double width, final double height ) { final int numXs = Math.max( 2, numX ); final double dx = width / ( numXs - 1 ); final double dy = 2.0f * Math.sqrt( 3.0f / 4.0f * dx * dx ); return Math.max( 2, Util.roundPos( height / dy ) + 1 ); }
public void setf( final int i, final float value ) { ip.set( i, Math.max( 0, Math.min( 65535, Util.roundPos( value ) ) ) ); } }
public void setf( final int i, final float value ) { ip.set( i, Math.max( 0, Math.min( 255, Util.roundPos( value ) ) ) ); } }
@Override final public void apply( final int cellXMin, final int cellYMin, final int cellXMax, final int cellYMax ) { final int xMin = Math.max( boxXMin, cellXMin ); final int yMin = Math.max( boxYMin, cellYMin ); final int xMax = Math.min( boxXMax, cellXMax ); final int yMax = Math.min( boxYMax, cellYMax ); for ( int y = yMin; y < yMax; ++y ) { int i = y * width + xMin; for ( int x = xMin; x < xMax; ++x ) { final float m = ( maskPixels[ i ] & 0xff ) / 255.0f; final float v = srcPixels[ i ] & 0xff; final float a = dstPixels[ i ] & 0xff; final float b = m * a + ( 1.0f - m ) * v; ipPixels[ i ] = ( byte )mpicbg.util.Util.roundPos( b ); ++i; } } } }
@Override final public void apply( final int cellXMin, final int cellYMin, final int cellXMax, final int cellYMax ) { final int xMin = Math.max( boxXMin, cellXMin ); final int yMin = Math.max( boxYMin, cellYMin ); final int xMax = Math.min( boxXMax, cellXMax ); final int yMax = Math.min( boxYMax, cellYMax ); for ( int y = yMin; y < yMax; ++y ) { int i = y * width + xMin; for ( int x = xMin; x < xMax; ++x ) { final float m = ( maskPixels[ i ] & 0xff ) / 255.0f; final float v = srcPixels[ i ] & 0xff; final float a = dstPixels[ i ] & 0xff; final float b = m * a + ( 1.0f - m ) * v; ipPixels[ i ] = ( byte )mpicbg.util.Util.roundPos( b ); ++i; } } } }
@Override final public void apply( final int cellXMin, final int cellYMin, final int cellXMax, final int cellYMax ) { final int xMin = Math.max( boxXMin, cellXMin ); final int yMin = Math.max( boxYMin, cellYMin ); final int xMax = Math.min( boxXMax, cellXMax ); final int yMax = Math.min( boxYMax, cellYMax ); for ( int y = yMin; y < yMax; ++y ) { int i = y * width + xMin; for ( int x = xMin; x < xMax; ++x ) { final float m = ( maskPixels[ i ] & 0xff ) / 255.0f; final float v = ipPixels[ i ] & 0xff; final float vSrc = srcPixels[ i ] & 0xff; final float a; if ( vSrc == 0 ) a = 1.0f; else a = ( float )( dstPixels[ i ] & 0xff ) / vSrc; final float b = v * ( 1.0f + m * ( a - 1.0f ) ); ipPixels[ i ] = ( byte )Math.max( 0, Math.min( 255, mpicbg.util.Util.roundPos( b ) ) ); ++i; } } } }
final float bb = vb * ( 1.0f + m * ( a - 1.0f ) ); final int r = Math.max( 0, Math.min( 255, mpicbg.util.Util.roundPos( br ) ) ); final int g = Math.max( 0, Math.min( 255, mpicbg.util.Util.roundPos( bg ) ) ); final int b = Math.max( 0, Math.min( 255, mpicbg.util.Util.roundPos( bb ) ) ); ipPixels[ i ] = ( r << 16 ) | ( g << 8 ) | b; ++i;
@Override final public void apply( final int cellXMin, final int cellYMin, final int cellXMax, final int cellYMax ) { final int xMin = Math.max( boxXMin, cellXMin ); final int yMin = Math.max( boxYMin, cellYMin ); final int xMax = Math.min( boxXMax, cellXMax ); final int yMax = Math.min( boxYMax, cellYMax ); for ( int y = yMin; y < yMax; ++y ) { int i = y * width + xMin; for ( int x = xMin; x < xMax; ++x ) { final float m = ( maskPixels[ i ] & 0xff ) / 255.0f; final float v = ipPixels[ i ] & 0xff; final float vSrc = srcPixels[ i ] & 0xff; final float a; if ( vSrc == 0 ) a = 1.0f; else a = ( float )( dstPixels[ i ] & 0xff ) / vSrc; final float b = v * ( 1.0f + m * ( a - 1.0f ) ); ipPixels[ i ] = ( byte )Math.max( 0, Math.min( 255, mpicbg.util.Util.roundPos( b ) ) ); ++i; } } } }
@Override final public void apply( final int cellXMin, final int cellYMin, final int cellXMax, final int cellYMax ) { final int xMin = Math.max( boxXMin, cellXMin ); final int yMin = Math.max( boxYMin, cellYMin ); final int xMax = Math.min( boxXMax, cellXMax ); final int yMax = Math.min( boxYMax, cellYMax ); final int min = ( int )ip.getMin(); for ( int y = yMin; y < yMax; ++y ) { int i = y * width + xMin; for ( int x = xMin; x < xMax; ++x ) { final float m = ( maskPixels[ i ] & 0xff ) / 255.0f; final int v = ipPixels[ i ] & 0xffff; final float vSrc = srcPixels[ i ] & 0xff; final float a; if ( vSrc == 0 ) a = 1.0f; else a = ( float )( dstPixels[ i ] & 0xff ) / vSrc; final float b = m * ( a * ( v - min ) + min - v ) + v; ipPixels[ i ] = ( short )Math.max( 0, Math.min( 65535, mpicbg.util.Util.roundPos( b ) ) ); ++i; } } } }
@Override final public void apply( final int cellXMin, final int cellYMin, final int cellXMax, final int cellYMax ) { final int xMin = Math.max( boxXMin, cellXMin ); final int yMin = Math.max( boxYMin, cellYMin ); final int xMax = Math.min( boxXMax, cellXMax ); final int yMax = Math.min( boxYMax, cellYMax ); final int min = ( int )ip.getMin(); for ( int y = yMin; y < yMax; ++y ) { int i = y * width + xMin; for ( int x = xMin; x < xMax; ++x ) { final float m = ( maskPixels[ i ] & 0xff ) / 255.0f; final int v = ipPixels[ i ] & 0xffff; final float vSrc = srcPixels[ i ] & 0xff; final float a; if ( vSrc == 0 ) a = 1.0f; else a = ( float )( dstPixels[ i ] & 0xff ) / vSrc; final float b = m * ( a * ( v - min ) + min - v ) + v; ipPixels[ i ] = ( short )Math.max( 0, Math.min( 65535, mpicbg.util.Util.roundPos( b ) ) ); ++i; } } } }
final static private int[] createHistogram( final int blockRadius, final int bins, final int blockXCenter, final int blockYCenter, final ByteProcessor src ) { final int[] hist = new int[ bins + 1 ]; final int xMin = Math.max( 0, blockXCenter - blockRadius ); final int yMin = Math.max( 0, blockYCenter - blockRadius ); final int xMax = Math.min( src.getWidth(), blockXCenter + blockRadius + 1 ); final int yMax = Math.min( src.getHeight(), blockYCenter + blockRadius + 1 ); for ( int y = yMin; y < yMax; ++y ) { final int row = src.getWidth() * y; for ( int x = xMin; x < xMax; ++x ) { ++hist[ mpicbg.util.Util.roundPos( src.get( row + x ) / 255.0f * bins ) ]; } } return hist; }
final static private int[] createHistogram( final int blockRadius, final int bins, final int blockXCenter, final int blockYCenter, final ByteProcessor src ) { final int[] hist = new int[ bins + 1 ]; final int xMin = Math.max( 0, blockXCenter - blockRadius ); final int yMin = Math.max( 0, blockYCenter - blockRadius ); final int xMax = Math.min( src.getWidth(), blockXCenter + blockRadius + 1 ); final int yMax = Math.min( src.getHeight(), blockYCenter + blockRadius + 1 ); for ( int y = yMin; y < yMax; ++y ) { final int row = src.getWidth() * y; for ( int x = xMin; x < xMax; ++x ) { ++hist[ mpicbg.util.Util.roundPos( src.get( row + x ) / 255.0f * bins ) ]; } } return hist; }
final static private class MapShortAlphaTriangleThread extends Thread { final private AtomicInteger i; final private List< AffineModel2D > triangles; final private TransformMesh transform; final ShortProcessor source, target; final ByteProcessor alpha; MapShortAlphaTriangleThread( final AtomicInteger i, final List< AffineModel2D > triangles, final TransformMesh transform, final ShortProcessor source, final ByteProcessor alpha, final ShortProcessor target ) { this.i = i; this.triangles = triangles; this.transform = transform; this.source = source; this.alpha = alpha; this.target = target; } @Override final public void run() { int k = i.getAndIncrement(); while ( !isInterrupted() && k < triangles.size() ) { mapShortAlphaTriangle( transform, triangles.get( k ), source, alpha, target );